我不知道如何正确地描述这个问题,但是基本上我想知道的是这样的东西可以毫无问题地编译:
// prototype
template <class T>
void pretty_function(T arg);
// specialization
template <class U, class V>
void pretty_function<U<V>>(T arg);
所以我想将类型 T 专门化为类型 U
答案 0 :(得分:2)
这听起来像是要声明pretty_function
的特化,该特化将仅接受U<V>
形式的类型,其中U
可以是任何类模板,而V
可以是任意种类。这将是 partial 专长,因为未完全指定模板参数T
。 C ++不支持功能模板的部分专业化。通常的解决方法是分派给可以部分专门化的助手类模板:
namespace detail {
template <class T>
struct pretty_function_helper {
static void doit(T arg) { /* implementation */ }
};
// partial specialization
template <template <class> class U, class V>
struct pretty_function_helper<U<V>> {
static void doit(U<V> arg) { /* implementation */ }
};
}
template <class T> void pretty_function(T arg) {
detail::pretty_function_helper<T>::doit(arg);
}