最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

北大同學(xué)黃雨松制作的北太天元插件代碼閱讀后,我想到可以用c++17 的 if c

2023-05-15 09:59 作者:盧朓  | 我要投稿

/**

?* 北太天元的插件開發(fā)示例,這個(gè)還不是完整的,我這幾天的視頻的想法是

?* 每次介紹很少的幾個(gè)知識點(diǎn),面向的對象是對c++11之后的特性不熟悉的同學(xué)。

?* 這是和前一個(gè)視頻相比增加了if constexpr 實(shí)現(xiàn)編譯期計(jì)算的功能。

?*/


#include <cstdlib>

#include <iostream>

#include <typeinfo>

#include <utility>

#include <array>

#include <map>

#include <vector>

#include "bex/bex.hpp"


namespace ParseParams {

???template <class _T>

??????class FunTrait;

???template <typename R, typename... Args>

??????class FunTrait<R(Args...)>{

?????????public:

????????????static constexpr size_t n_args = sizeof...(Args);

????????????static constexpr const std::array<const std::type_info *, n_args> infos = {&typeid(Args)...};


?????????public:

?????????int required_params;

?????????std::array<void *, n_args> passed_args_ptr;

?????????//變量類型函數(shù)句柄, 變量名是decorated_func

?????????R(*decorated_func)

????????????(Args...);



?????????public:

?????????FunTrait(R (*func)(Args...), int num_required = 0){

????????????decorated_func = func;

??????????required_params = num_required;

?????????}


?????????template <size_t... I>

?????????R eval_impl(std::index_sequence<I...>){

????????????std::cout<<"必須的參數(shù)個(gè)數(shù)是 = " << required_params << std::endl;

????????????return decorated_func((Args)passed_args_ptr[I]...);

?????????}


?????????R eval(){

????????????return eval_impl(std::make_index_sequence<n_args>());

?????????}


?????????int check_in_args_type(int nrhs, const bxArray * prhs[]){

????????????for(size_t i= 0; i< n_args; i++){

???????????????if(infos[i]->name() == typeid(const double *).name()){

??????????????????if(!bxIsDouble(prhs[i])){

?????????????????????bxPrintf("第%d輸入?yún)?shù)必須是double類型",i);

?????????????????????return 1;

??????????????????}

??????????????????passed_args_ptr[i] = (void *)(bxGetDoubles(prhs[i]));

???????????????}???

???????????????else if(infos[i]->name() == typeid(const int32_t *).name()){

??????????????????if(!bxIsInt32(prhs[i])){

?????????????????????bxPrintf("第%d輸入?yún)?shù)必須是int32類型",i);

?????????????????????return 1;

??????????????????}

??????????????????passed_args_ptr[i] = (void *)(bxGetInt32s(prhs[i]));

???????????????}???

???????????????else if(infos[i]->name() == typeid(const int64_t *).name()){

??????????????????if(!bxIsInt64(prhs[i])){

?????????????????????bxPrintf("第%d輸入?yún)?shù)必須是int64類型",i);

?????????????????????return 1;

??????????????????}

??????????????????passed_args_ptr[i] = (void *)(bxGetInt64s(prhs[i]));

???????????????}???

???????????????else if(infos[i]->name() == typeid(const std::string *).name()){

??????????????????if(!bxIsString(prhs[i])){

?????????????????????bxPrintf("第%d輸入?yún)?shù)必須是string類型",i);

?????????????????????return 1;

??????????????????}

??????????????????passed_args_ptr[i] = (void *)(new std::string(bxGetStringDataPr(prhs[i])));

??????????????????/**

??????????????????* 這兒new 的東西,沒有delete,會有內(nèi)存泄漏

??????????????????*/

???????????????}

???????????????else {

?????????????????????bxPrintf("第%d輸入?yún)?shù)類型不對",i);

?????????????????????return 1;

???????????????}

????????????}

????????????return 0;

?????????}


?????????void return_to_bxArray(R result, int nlhs, bxArray *plhs[]){

????????????if(nlhs <= 0 ) return;

????????????if constexpr (std::is_same<char, R>::value){

???????????????char tmp[2] ={result, '\0'};

???????????????plhs[0] = bxCreateString(tmp);???

????????????}???

????????????else if constexpr (std::is_same<int32_t,R>::value){

???????????????plhs[0] = bxCreateInt32Scalar(result);

????????????}

????????????else if constexpr (std::is_same<double,R>::value){

???????????????plhs[0] = bxCreateDoubleMatrix(1,1,bxREAL);

???????????????double * ptr = bxGetDoubles(plhs[0]);

???????????????*ptr = result;

????????????}???

????????????else if constexpr (std::is_same<std::string,R>::value){

???????????????plhs[0] = bxCreateString(result.c_str());

????????????}

?????????}


??????};

}



char h(const int *j , const std::string?*str ){

???std::cout<<" *j = "<<*j << std::endl;

???std::cout<<" *str = "<<*str << std::endl;

???std::cout<<" (*str)[*j] = "<<(*str)[*j]<< std::endl;

???return (*str)[*j];

}


void cmd_h(int nlhs, bxArray *plhs[], int nrhs, const bxArray *prhs[]) {

???ParseParams::FunTrait<decltype(h)> q(h,0);

???if(nrhs < q.n_args ){

??????bxPrintf("輸入?yún)?shù)%d < %d", nrhs, q.n_args);

??????return;

???}???

???if(0 != q.check_in_args_type(nrhs, prhs)){

??????bxPrintf("輸入?yún)?shù)賦值出錯\n");

??????return;

???}

???auto result = q.eval();

???q.return_to_bxArray(result, nlhs, plhs);


}



static bexfun_info_t flist[] = {

?{"cmdd_h", cmd_h, nullptr},

?{"", nullptr, nullptr},

};


bexfun_info_t *bxPluginFunctions() {

?return flist;

}



北大同學(xué)黃雨松制作的北太天元插件代碼閱讀后,我想到可以用c++17 的 if c的評論 (共 條)

分享到微博請遵守國家法律
大悟县| 海原县| 交城县| 博兴县| 元谋县| 十堰市| 灵川县| 靖边县| 普兰店市| 常德市| 林州市| 毕节市| 同心县| 香港 | 贵定县| 土默特左旗| 南靖县| 两当县| 班戈县| 博罗县| 广东省| 光山县| 山东省| 诸暨市| 襄汾县| 务川| 富源县| 海阳市| 哈尔滨市| 视频| 南宫市| 九龙县| 宜黄县| 开鲁县| 剑川县| 平阳县| 民丰县| 龙口市| 治县。| 赞皇县| 阳西县|