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

问题描述 投票:0回答:1

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

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()
{
}

MSVC产生最详细的输出和可能的解释(正确或错误),以解释代码无法编译的原因。

source_file.cpp(20): error C2923: 'Bar': 'Func' is not a valid template type argument for parameter 'T'
source_file.cpp(1): note: see declaration of 'Func'
source_file.cpp(20): error C2990: 'Bar': non-class template has already been declared as a class template
source_file.cpp(13): note: see declaration of 'Bar'
source_file.cpp(20): error C2946: explicit instantiation; 'Bar' is not a template-class specialization  

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

c++ variadic-templates
1个回答
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>

© www.soinside.com 2019 - 2024. All rights reserved.