使用SFINAE模板化构造函数时出现问题

时间:2017-04-09 12:47:32

标签: c++ templates sfinae c++03 c++98

以下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_ifis_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

1 个答案:

答案 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*