c ++模板类根据类型通过ref传递构造函数

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

Bar*_*rry 6

您只需要一个构造函数.毕竟,它在两种情况下都做同样的事情吗?首先,定义一个类型特征,它基于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)