将接受任意数量和类型的参数的函数作为类模板参数传递

时间:2018-09-04 10:20:00

标签: c++ variadic-templates

我知道函数可以是模板参数。但是,当模板为可变字体时,GCC,Clang和MSVC(rextester上的编译版本)不会编译,如下所示:

SecurityContext

MSVC会产生最冗长的输出,并可能(正确或错误)解释为什么代码无法编译。

void Func( int ){}

template<void (*)(int)>
struct Foo{};

template struct Foo<Func>; // Compiles

template<typename>
struct Bar;

template<typename ...Args>
struct Bar<void(*)(Args...)>
{
};

template struct Bar<Func>; // Does NOT compile (why???)

int main()
{
}

传递本身接受任意数量的参数作为类模板参数的函数的合适语法是什么。

1 个答案:

答案 0 :(得分:2)

Func不是类型,而是函数,

您可能想要:

template struct Bar<decltype(&Func)>;

或者也许

template<typename F, F f> struct Bar;

template <typename ...Args, void(*f)(Args...)>
struct Bar<void(*)(Args...), f>
{
};

Bar<decltype(&Func), &Func>

可以简化为(自C ++ 17起):

template <auto> struct Bar;

template <typename ...Args, void(*f)(Args...)>
struct Bar<f>
{
};

Bar<&Func>