为什么第二个函数与类定义中的模板不匹配?
Class C {
template <typename T, typename T2 = T>
T val() const;
};
template <>
std::string C::val() const {
//OK
}
template <typename T, typename std::enable_if<std::is_arithmetic<T>::value>::type>
T C::val() const {
//Not OK
}
编辑: 这是我想要实现的概述。基本上我正在编写一个函数来解析并返回一个基于模板类型的对象。我有一些我自己定义的类,就是我必须对其成员进行解析。我还需要解析数值类型和字符串。所以我为每个定义的类编写了一个专用版本。一个解析为数字类型并返回给定类型的版本(当然我必须确保给定的类型是数字,因此启用if)
答案 0 :(得分:3)
要使用SFINAE,请在模板声明中使用它,而不是专业化:
class C {
template <typename T, typename T2 = typename std::enable_if<std::is_arithmetic<T>::value>::type>
T val() const;
};
如果你想区分arithemtic和non-arithmetic类型(允许两者),你可以使用标记:
class C {
public:
struct arithmetic_tag {};
struct non_arithmetic_tag {};
template <typename T>
T val(typename std::conditional<std::is_arithmetic<T>::value, arithmetic_tag, non_arithmetic_tag>::type tag = {}) const
{
return get_val<T>(tag);
}
private:
template <typename T>
T get_val(C::non_arithmetic_tag) const;
template <typename T>
T get_val(C::arithmetic_tag) const;
};
或者将专业化委托给助手类:
class C {
public:
template <typename T>
T val() const
{
return ValGetter<T>::get(this);
}
private:
template <typename T, bool is_arithmetic = std::is_arithmetic<T>::value>
struct ValGetter;
};
// Arithmetic
template <typename T>
struct C::ValGetter<T, true>
{
static T get(C const* c);
};
// Non-arithmetic
template <typename T>
struct C::ValGetter<T, false>
{
static T get(C const* c);
};
编辑:部分特化(bool
参数)不适用于方法,而是显示标记和辅助类