【问题标题】:template function pointer overloading模板函数指针重载
【发布时间】:2016-01-06 16:06:28
【问题描述】:

我有一个像

这样的模板函数
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&lt;int&gt; 并使用test&lt;T&gt; 以便我可以在运行时使用任何变量类型?

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

template<> //template<typename T>
test<T> ltest[] = = { {"ABS", ABS}, {"ADD", ADD}, ..... };

【问题讨论】:

    标签: c++ templates pointers function-pointers


    【解决方案1】:

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

    可能有一种方法可以使用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 以便参数类型没有 constconst&amp;。他们需要:

    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&lt;int&gt;use test&lt;T&gt; 以便我可以在运行时使用任何变量类型?

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

    【讨论】:

    • @R Sahu:我还需要用funcptr1调用ABS,用funcptr2调用ADD吗?有没有办法使用可变参数模板实现相同的功能?
    • @user2896993,您可能可以做到,但不会一帆风顺。我好奇。您是否正在尝试解决真正的问题,或者这是一种求知欲?
    • @R Sahu:我需要一个解决方案。大约有 700 多个具有不同数据类型和参数长度的小型模板函数。如果我使用 if else 或 switch case 来识别我需要调用哪个函数指针(函数),我的代码在运行时变得越来越长且耗时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多