对模板返回值的完全特殊模板函数

时间:2015-11-28 08:47:07

标签: templates c++11

假设我有这样的模板函数:

template <typename Key>
Key foo(const string &name);

我知道,为了专门化模板功能,我们必须完全专注于它:

template<>
int foo<int>(const string &name);

但是现在我正在寻找一种方法来为模板对象专门化这个函数,如下所示:

template<>
Bar<Key> foo<Bar<Key>>(const string &name);

我认为这不会违反任何关于专业化和功能覆盖的c ++ 11法则。但我还是找不到办法做到这一点。

我更喜欢不使用类而不是函数来实现此功能的部分特化。您是否有任何建议来实现此功能并将其专门用于模板返回值?

修改

我作为专业化示例提到的函数没有有效的语法,因为它具有未定义的类型Key。我只是写它来表明没有可能的解决方案。如果我尝试将其完全定义为:

template<typename Key>
Bar<Key> foo<Bar<Key>>(const string &name);

编译器无法编译它,因为它被假定为部分特化函数。

1 个答案:

答案 0 :(得分:1)

有一种方法可以用foo魔法超载(而不是专门化)enable_if

template <typename Key>
typename std::enable_if<!is_specializaton<Bar, Key>::value, Key>::type
foo(const string &name);

template<typename KeyCont>
typename std::enable_if<is_specializaton<Bar, KeyCont>::value, KeyCont>::type
foo(const string &name);

其中is_specialization可以这样定义:

template <template<typename...> class T, typename ... args>
struct is_specializaton {
    static const bool value = false;
};

template <template<typename ... > class a, typename ... args >
struct is_specializaton<a, a<args...>> {
    static const bool value = true;
};