专门为参数使用两个模板参数(C ++模板)

时间:2018-08-03 05:36:00

标签: c++ templates

我不知道如何正确地描述这个问题,但是基本上我想知道的是这样的东西可以毫无问题地编译:

// prototype
template <class T>
void pretty_function(T arg);

// specialization
template <class U, class V>
void pretty_function<U<V>>(T arg);

所以我想将类型 T 专门化为类型 U ,其中类型 U 需要模板参数 V 。我想我可以轻松地在本地工作站上对此进行测试,但是我将其留在此处以供将来参考。

1 个答案:

答案 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);
}