模板函数指针重载

时间:2016-01-06 16:06:29

标签: 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;
}

我需要使用单个函数指针调用函数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} };

有办法吗? 1)使用单个函数指针 2)摆脱初始化test<int>并使用test<T>以便我可以在运行时使用任何变量类型?

我正在寻找像

这样的简单初始化
template<> //template<typename T>
test<T> ltest[] = = { {"ABS", ABS}, {"ADD", ADD}, ..... };

1 个答案:

答案 0 :(得分:2)

  

有没有办法使用单个函数指针?

使用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<int> ltest[] = { {"ABS", ABS}, {"ADD", ADD}, {"MIXED", ABS, ADD} };

如果您不允许使用{"MIXED", ABS, ADD}构造对象,可以删除最后一个构造函数。

顺便说一句,为了使用上述内容,您需要修改ABSADD,以便参数类型不具有const或{{ 1}}。他们需要:

const&
  

有没有办法摆脱初始化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; } test<int>,以便我可以在运行时使用任何变量类型?

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