gpt4 book ai didi

c++ - 从构造函数中 - 有条件地调用成员变量的构造函数重载

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:04 24 4
gpt4 key购买 nike

背景:

我想做的是类似于下面的事情(代码不起作用):

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 不共享一个公共(public)基类,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;

最佳答案

如果 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) ) {}

关于c++ - 从构造函数中 - 有条件地调用成员变量的构造函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com