代码之家  ›  专栏  ›  技术社区  ›  Olumide

传递一个函数,该函数接受任意数量和类型的参数作为类模板参数

  •  0
  • Olumide  · 技术社区  · 6 年前

    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  
    

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jarod42    6 年前

    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> .