以下2之间有什么区别:
template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
explicit Approx(const T& value) {}
VS
template <typename T>
explicit Approx(const typename std::enable_if<std::is_constructible<double, T>::value, T>::type& value) {}
Approx
是普通类的构造函数(未模板化),我需要double
可构造的类型
我的问题是第一个工作,但不是C ++ 98(默认模板参数等 - 我有自己的enable_if
和is_constructible
的c ++ 98特征<) / p>
我问的原因是因为我想支持double
的强类型定义:
class Volatility {
double underlying_;
public:
explicit Volatility(double u) : underlying_(u) {}
explicit operator double() const { return underlying_; }
};
Approx(Volatility(1.)); // error
答案 0 :(得分:4)
你的C ++ 03版本不起作用,因为它不能推断T,给定参数。构造函数的常用C ++ 03机制是一个额外的默认参数。
template<typename T>
explicit Approx(const T& value, typename std::enable_if<std::is_constructible<double, T>::value>::type* dummy = 0) {}
T
可以通过此表单进行推理,如果T
符合enable_if
指定的期望,则额外参数最终为void*
。