fuj*_*uji 2 c++ templates metaprogramming parameter-passing sfinae
假设我有一个看起来像这样的类,如果它T是一个简单的类型,double或者通过引用,如果T更复杂,则应该通过值构造.
到目前为止我的代码看起来像这样:
template<class T>
class Val {
public:
Val() = default;
Val(double v) : _v(v) {}
template<typename U = T>
Val(const &T v,
typename std::enable_if<!std::is_same<U,double>::value, bool>::type = 0)
: _v(v) {}
private:
T _v;
};
Run Code Online (Sandbox Code Playgroud)
哪个有效,但感觉非常粗略,因为在构造函数中引入了一个额外的参数.这个问题有更好的解决方案吗?这似乎更适合过载或模板专业化解决方案?对于所有简单类型(,......)int,这通常可以解决吗?floatdouble
您只需要一个构造函数.毕竟,它在两种情况下都做同样的事情吗?首先,定义一个类型特征,它基于T值或值:
template <typename T>
using param_type = std::conditional_t<
is_complex_type<T>::value,
T const&,
T>;
Run Code Online (Sandbox Code Playgroud)
哪里is_complex_type是稍后确定一些适当的类型特征.也许is_fundamental就像提出的其他答案一样.
然后使用它:
template<class T>
class Val {
public:
Val() = default;
Val(param_type<T> v) : _v(v) { }
};
Run Code Online (Sandbox Code Playgroud)