类型特征依赖模板功能的专业化

时间:2018-07-03 07:11:38

标签: c++ templates c++14

我有一个简单的模板化函数,在我正在使用的库中定义

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;
}

但是我无法完成这项工作,未使用我专门的功能。如何实现对已经定义的模板函数的专业化?

1 个答案:

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

LIVE