C++ 部分模板专门化,使用模板化类型(嵌套模板类)

C++ 部分模板专门化,使用模板化类型(嵌套模板类),c++,c++11,variadic-templates,C++,C++11,Variadic Templates,给定通用函数foo: template<typename T> void foo(T a) { a(); } 我想将这个函数专门化为一个类型Bar,但是,Bar本身有几个模板参数。 我试图将foo专业化如下: template<typename... Args> void foo<Bar<Args...> >(Bar<Args...> a) { a(42); } 然而,这并不完全有效。有人能帮我吗?谢谢没有函数模板的部分专门化。一种

给定通用函数foo:

template<typename T> void foo(T a) { a(); }
我想将这个函数专门化为一个类型Bar,但是,Bar本身有几个模板参数。 我试图将foo专业化如下:

template<typename... Args> void foo<Bar<Args...> >(Bar<Args...> a) { a(42); }

然而,这并不完全有效。有人能帮我吗?谢谢

没有函数模板的部分专门化。一种方法是委托给一个类模板,它实际上可以部分地被专门化。大致如下:

template <typename T>
struct FooImpl {
  static void foo(T a) { /* general implementation */ }
};

template<typename... Args>
struct FooImpl<Bar<Args...>> {
  static void foo(Bar<Args...> a) { /* special implementation */ }
};

template<typename T>
void foo(T a) { FooImpl<T>::foo(a); }

将其设为template void fooBar a{a42;},则会有两个重载函数模板。这应该行得通;当参数实际上是一个条形图时,应该通过重载解析选择一个更专业的条形图。。我觉得使用运算符和CRTP可能会有所帮助?@Swift FridayPie运算符可能很合适,但我不认为CRTP会给表带来什么?@Quentin如果这是一个重复模式,而不是不断编写运算符或其他接口,那么继承一个。