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
,这通常可以解决吗?float
double
您只需要一个构造函数.毕竟,它在两种情况下都做同样的事情吗?首先,定义一个类型特征,它基于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)
归档时间: |
|
查看次数: |
165 次 |
最近记录: |