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

标签 c++ templates parameter-passing metaprogramming 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;
};

这行得通,但感觉真的很粗略,因为在构造函数中引入了一个额外的参数。这个问题有更好的解决方案吗?这似乎更适合重载或模板特化解决方案?对于所有简单类型(intfloatdouble...),这是否可以普遍解决?

最佳答案

你只需要有一个构造函数。毕竟,它在两种情况下都做同样的事情,对吗?首先,定义一个基于 T 的类型特征,它是一个值或引用:

template <typename T>
using param_type = std::conditional_t<
                       is_complex_type<T>::value,
                       T const&,
                       T>;

is_complex_type 是稍后要确定的一些适当的类型特征。也许它是 is_fundamental 正如其他答案所建议的那样。

然后直接使用它:

template<class T>
class Val {
public:
    Val() = default;
    Val(param_type<T> v) : _v(v) { }
};

关于c++模板类根据类型通过ref传递构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32258444/

相关文章:

c++ - 在 View 中用 ID 替换字符串的简单方法

c++ - 作为另一个函数参数的函数调用是否遵循任何定义的行为?

ruby - Ruby 中的“通过引用传递参数”?

具有指定模板参数的 C++11 make_pair 无法编译

C++ << 运算符重载和 Arduino 模板

c - 将值传递给 C 上的 typedef 结构

php - 将数据库对象从类中的一个方法传递到另一个方法的正确方法是什么

c++ - 在处理之前评估宏参数

c++ - 从 double 转换为 unsigned int 时得到错误的结果

C++:使用模板继承类