我们假设我有一个看起来像这样的类,如果sq_item
是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;
};
哪个有效,但感觉非常粗略,因为在构造函数中引入了一个额外的参数。这个问题有更好的解决方案吗?这似乎更适合过载或模板专业化解决方案?对于所有简单类型(int
,float
,double
......),这通常可以解决吗?
答案 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;
};