gpt4 book ai didi

c++ - 将 SFINAE 用于模板化构造函数时遇到问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:02 27 4
gpt4 key购买 nike

下面两个有什么区别:

template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
explicit Approx(const T& value) {}

对比

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 特性)

我问的原因是因为我想支持 double 的强类型定义:

class Volatility {
double underlying_;
public:
explicit Volatility(double u) : underlying_(u) {}
explicit operator double() const { return underlying_; }
};

Approx(Volatility(1.)); // error

最佳答案

你的 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 指定的期望,则额外的参数最终为 无效*

关于c++ - 将 SFINAE 用于模板化构造函数时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com