用于定义typedef的变量模板(使用C ++ 11)

时间:2017-05-18 21:32:39

标签: c++ templates typedef

我刚刚定义了4种不同的typedef,差别很小,我想知道是否有更好的方法来使用模板。

我的typedef格式为:typedef Type1 (*pf)(Type2, Type3, ...)

如何模拟此typedef?

只需要Type1

我手动写道:

typedef int (*pf)(int)
typedef bool (*pf)()
typedef char (*pf)(bool, int)

我正在寻找类似的东西:

template <Type T1,Type...Rest>
typedef T1 (*pf)(Type...Rest)

这是对的吗?

2 个答案:

答案 0 :(得分:5)

是的,确定,两行(可能是单行,具体取决于您的代码风格):

template<class T, class... X>
using fptr_t = T (*)(X...);

这采用了一种称为alias templatehttp://en.cppreference.com/w/cpp/language/type_alias

的技术

别名模板在某种意义上类似于类模板,它不定义新类型(如类型别名),而是定义用于定义新类型的模板。当与不同类型一起使用时,它会根据此模板为您提供类型定义。这是C ++ 11的功能。

答案 1 :(得分:1)

您可以通过推迟专用于函数签名的模板类来创建易于读取的函数指针typedef:

#include <iostream>


namespace detail {
    // define the template concept
    template<class Sig>
    struct function_ptr;

    // specialise on pointer to function of a given signature    
    template<class Ret, class...Args>
    struct function_ptr<Ret (Args...)>
    {
        using type = Ret (*)(Args...);
    };
}

// defer to template specialisation    
template<class Sig>
using function_ptr = typename detail::function_ptr<Sig>::type;

int test1(int) { return 0; }
bool test2() { return false; }
char test3(bool, int) { return 'a'; }

int main()
{

    using pfi = function_ptr <int (int)>;
    using pfv = function_ptr <bool ()>;
    using pfbi = function_ptr <char (bool, int)>;

    auto pt1 = pfi(test1);
    auto pt2 = pfv(test2);
    auto pt3 = pfbi(test3);

    std::cout << pt1(100) << std::endl;
    std::cout << pt2() << std::endl;
    std::cout << pt3(true, 100) << std::endl;
}