假设我有这样的模板函数:
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);
编译器无法编译它,因为它被假定为部分特化函数。
答案 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;
};