我有以下情况:
根据Derived
类构造函数的输入值,我需要调用另一个Base
类构造函数。
如:
struct Base
{
Base() : v(0) {}
Base(int _v) : v(_v) {}
int v;
};
struct Derived
{
Derived(int v) /* if v == 42 call Base() else call Base(int) */ {}
};
int main()
{
Derived f2(42);
Derived f1(1);
}
根据我目前对C ++的了解,我认为这是不可能的,所以我问社区他们是否知道任何黑客或脏代码会使这个可行。请不要让简单int
误导您,现实生活场景要复杂得多。随意混合使用C ++ 11 magic。
编辑:另外,我不想使用“init”函数,它根据参数的值初始化不同的东西。
答案 0 :(得分:7)
这确实是一个非常奇怪的请求,也许你应该重新考虑一般方法。这个特定42
值的含义是什么? 问题的答案是什么?答案是什么?对于Derived
案例或{{1},您可能应该有两个兄弟Derived
或子类x==42
可能x!=42
来自不同类型的对象,您可以为该类型使用单独的构造函数吗?
但是如果你确实想要完成你所要求的,那么一种可能的方法是在42
中有两个不同的构造函数和一个“命名构造函数”(静态函数)来在它们之间进行路由。类似的东西(没有检查可编辑性,但想法应该清楚):
Derived
为此,您还需要复制构造函数,但您也可以返回指针等。
另一种方法,如果在编译时固定42的值,则使用模板并将构造函数甚至类专门化为特定值42。
我认为应该使用的另一种方法,要求基类可以复制或移动构造:
struct Derived {
private:
Derived(int x): Base(x) {}
Derived(): Base() {}
public:
static Derived ConstructDerived(int x) {
if (x==42) return Derived();
else return Derived(x);
}
};
// usage
Derived a = Derived::ConstructDerived(42);
Derived b = Derived::ConstructDerived(43);