【发布时间】:2019-04-13 18:16:36
【问题描述】:
拥有此代码:
struct Vec3 {
int x;
int y;
int z;
};
template <typename T>
class myProperty {
public:
myProperty(const T& initValue) : m_value{initValue} {}
private:
T m_value;
};
创建myProperty类型对象时:
myProperty<int> ip{1};
myProperty<Vec3> vp1{{1, 2, 3}};
// myProperty<Vec3> vp2{1, 2, 3}; ERROR: myProperty doesn't have a matching constructor.
有没有一种优雅的方式让vp2 初始化工作?将myProperty 专门用于Vec3 是一种矫枉过正。
【问题讨论】:
-
是否让
myProperty本身成为一个聚合选项? (即删除构造函数并将m_value公开。)否则,唯一的解决方案是看到模板构造函数,它将其参数转发给T构造函数:template <typename ...P> myProperty(P &&... p) : m_value(std::forward<P>(p)...) {}。 -
@HolyBlackCat,即won't compile。为了让它工作,你必须加上额外的括号,比如
m_value({std::forward<P>(p)...}),这样vp2case 会编译,但vp1不会。并且将myProperty设为聚合不是一种选择。 -
糟糕。它应该是
: m_value{std::forward<P>(p)...},否则myProperty<int> ip{1};不会编译。 “vp2 case 会编译,但 vp1 不会” 这是否意味着你希望vp1和vp2都编译,而不仅仅是vp2? -
@HolyBlackCat,实际上不,我不希望 vp1 编译 :) 我的错,没有彻底测试你的建议,假设像
vp4{myVec3Objet}这样的东西也不会编译,但它确实,所以这看起来不错:) 如果您发布它会接受答案。 -
原来它破坏了复制构造(因为如果参数是非常量,它比
myProperty(const myProperty &)更好的匹配)。如果我弄清楚如何以一种简洁的方式解决这个问题,我会发布一个答案。
标签: c++ class templates constructor c++14