【发布时间】:2015-08-27 20:02:38
【问题描述】:
假设我有一个看起来像这样的类,如果 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...),这是否可以普遍解决?
【问题讨论】:
-
除非构造函数非常复杂以至于无法内联,否则我怀疑按值/引用传递对“简单类型”有影响。对我来说,这听起来确实是不必要的微优化。
标签: c++ templates parameter-passing metaprogramming sfinae