【发布时间】:2013-11-18 06:37:24
【问题描述】:
背景:
我想做的是类似于以下的事情(代码不起作用):
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;
【问题讨论】:
-
我最近回答了一个非常相似的问题,但找不到。
标签: c++ constructor ternary-operator c++03 overload-resolution