Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板函数指针重载_C++_Templates_Pointers_Function Pointers - Fatal编程技术网

C++ 模板函数指针重载

C++ 模板函数指针重载,c++,templates,pointers,function-pointers,C++,Templates,Pointers,Function Pointers,我有一个模板函数,比如 template<typename T> T ABS(const T& DiIN){ return (0 > DiIN) ? T(DiIN * (-1)) : T((DiIN)); } template<typename T> T ADD(const T DiIN1, const T DiIN2) { return DiIN1 + DiIN2; } 模板T ABS(常数T&DiIN){ 返回值(0>DiIN)?T(

我有一个模板函数,比如

template<typename T> T ABS(const T& DiIN){
    return (0 > DiIN) ? T(DiIN * (-1)) : T((DiIN));
}

template<typename T> T ADD(const T DiIN1, const T DiIN2) {
    return DiIN1 + DiIN2;
}
模板T ABS(常数T&DiIN){
返回值(0>DiIN)?T(DiIN*(-1)):T((DiIN));
}
模板T添加(常数T DiIN1,常数T DiIN2){
返回DiIN1+DiIN2;
}
我需要使用单个函数指针调用函数ABS和/或ADD。 目前我使用两个不同的函数指针名称,但发现当我包含更多具有不同参数长度的模板函数时,它变得越来越复杂

我当前的实现类似于

template<typename T>
struct test {
    std::string funcName;
    T(funcptr1 *)(T);
    T(funcptr2 *)(T, T);
};

test<int> ltest[] = { {"ABS", ABS, NULL}, {"ADD", NULL, ADD} };
模板
结构测试{
std::字符串名称;
T(funcptr1*)(T);
T(funcptr2*)(T,T);
};
测试ltest[]={{“ABS”,ABS,NULL},{“ADD”,NULL,ADD};
有办法去吗 1) 使用单个函数指针 2) 去掉初始化
test
并使用
test
,这样我就可以在运行时使用任何变量类型了

我正在寻找一个简单的初始化,如

template<> //template<typename T>
test<T> ltest[] = = { {"ABS", ABS}, {"ADD", ADD}, ..... };
template//template
测试ltest[]={{“ABS”,ABS},{“ADD”,ADD},…};
有没有一种方法可以使用单个函数指针

使用
std::function
可能有一种方法可以做到这一点。但是,您可以通过提供一些构造函数来获得所需的简单性

template <typename T>
struct test {

   using function1_type = T(*)(T);
   using function2_type = T(*)(T, T);

   test(std::string fname, function1_type f1) : funcName(fname), funcptr1(f1), funcptr2(nullptr) {}
   test(std::string fname, function2_type f2) : funcName(fname), funcptr1(nullptr), funcptr2(f2) {}
   test(std::string fname, function1_type f1, function2_type f2) : funcName(fname), funcptr1(f1), funcptr2(f2) {}

    std::string funcName;
    function1_type funcptr1;
    function2_type funcptr2;
};
有没有办法摆脱初始化
test
usetest
,这样我就可以在运行时使用任何变量类型


不,你不能那样做。用于实例化模板的类型必须在编译时已知。

@R Sahu:我是否仍需要使用funcptr1调用ABS和funcptr2调用ADD??有没有一种方法可以使用可变模板实现相同的功能?@user2896993,您可能可以这样做,但它不会是直接的。我很好奇。你是在试图解决一个真正的问题,还是出于对知识的好奇?@R Sahu:我需要一个解决方案。大约有700多个这样的小模板函数,具有不同的数据类型和参数长度。如果我使用if-else或switch-case来确定需要调用哪个函数指针(函数),那么我的代码在运行时会变得更长、更耗时。
test<int> ltest[] = { {"ABS", ABS}, {"ADD", ADD}, {"MIXED", ABS, ADD} };
template<typename T> T ABS(T DiIN){
    return (0 > DiIN) ? T(DiIN * (-1)) : T((DiIN));
}

template<typename T> T ADD(T DiIN1, T DiIN2) {
    return DiIN1 + DiIN2;
}