背景:
我想做的是类似于以下内容(代码不起作用):
class A {
public:
A(TypeX a)
{
/* initialize using TypeX */
}
A(TypeY a)
{
/* initialize using TypeY */
}
};
class B {
private:
A a;
static const TypeX x;
static const TypeY y;
public:
B(bool useTypeX)
: a(useTypeX ? x : y)
{}
};
TypeX B::x;
TypeY B::y;这将是我想要的代码(如果语言支持它),但是B::a的初始化程序列表结构中的三元操作符在编译时不会对两种不同类型执行重载解析(请参见:https://stackoverflow.com/a/8535301/1689844)。
请注意,我只控制B级的设计。类A、TypeX和TypeY是完全不同的类型,超出了我的控制范围(同时,TypeX和TypeY不共享公共基类,也不能将TypeX转换为TypeY,反之亦然)。而且,A类初始化成本很高(因此复制构造函数是不可行的)。
问题:
我想知道是否有人知道比B类的以下实现更优雅的解决方案来实现我想要的行为:使用C++11特性的答案是受欢迎的,但我仅限于使用C++03,因此我只接受使用C++03特性的答案:
class B {
private:
SomeSmartPointer<A> a;
static const TypeX x;
static const TypeY y;
public:
B(bool useTypeX)
{
// SomeSmartPointer is a smart pointer
// which uses reference-counting to
// delete allocated memory when the
// reference count is 0 and it is
// copy-constructable
if (useTypeX)
{
SomeSmartPointer<A> tmp(x);
a = tmp;
}
else
{
SomeSmartPointer<A> tmp(y);
a = tmp;
}
}
};
TypeX B::x;
TypeY B::y;发布于 2013-11-06 20:30:51
如果A是可复制的(或者是可移动的,但这不相关,因为您没有使用C++11),那么您可以这样做
class B {
private:
A a;
static const TypeX x;
static const TypeY y;
static A initA(bool useTypeX)
{
if (useTypeX)
return A(x);
else
return A(y);
}
public:
B(bool useTypeX)
: a(initA(useTypeX))
{}
};编辑:当然,考虑到这一点,这是合法的,不需要额外的功能。关键是要显式地创建它们。请参阅https://ideone.com/yUIF0Z
B(bool useTypeX) : a( useTypeX ? A(x) : A(y) ) {}https://stackoverflow.com/questions/19822007
复制相似问题