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

时间:2015-08-27 20:02:38

标签: c++ templates parameter-passing metaprogramming sfinae

我们假设我有一个看起来像这样的类,如果sq_itemT这样的简单类型,或者doubleT,那么它应该按值构造更复杂。

到目前为止我的代码看起来像这样:

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 ......),这通常可以解决吗?

3 个答案:

答案 0 :(得分:6)

您只需要一个构造函数。毕竟,它在两种情况下做同样的事情对吗?首先,定义一个基于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) { }
};

答案 1 :(得分:4)

std::is_fundamental应该适合你。对我来说最好看的解决方案是:

template<class T>
typename std::enable_if< std::is_fundamental<T>::value >::type func(T p_arg){}

template<class T>
typename std::enable_if< !std::is_fundamental<T>::value >::type func(T const &p_arg){}

答案 2 :(得分:1)

您可以使用boost::call_traits<T>::param_type

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