我有一个简单的模板化函数,在我正在使用的库中定义
template<class T>
T create(std::vector<char>& data)
{
T newValue{};
/* Do something with data */
return newValue;
}
我想专门介绍这个功能,以防T实现特定接口
template<class T>
std::enable_if_t<std::is_base_of<Interface, T>::value, T> create( std::vector<char>& data)
{
T newValue{};
newValue.InterfaceFunction(data);
return newValue;
}
但是我无法完成这项工作,未使用我专门的功能。如何实现对已经定义的模板函数的专业化?
答案 0 :(得分:1)
这不是模板专门化,而是模板重载,功能模板不能是部分专门化。问题是,当您指定从Interface
派生的类型时,两个功能模板都是完全匹配的,这会导致模棱两可。
您可以申请SFINAE。
template<class T>
std::enable_if_t<!std::is_base_of<Interface, T>::value, T> create(std::vector<char>& data)
{
T newValue{};
/* Do something with data */
return newValue;
}
template<class T>
std::enable_if_t<std::is_base_of<Interface, T>::value, T> create( std::vector<char>& data)
{
T newValue{};
newValue.InterfaceFunction(data);
return newValue;
}