根据输入参数值调用不同的基础 class 构造函数

Calling different base class constructors depending on input parameter value

我有以下场景:

根据 Derived class 构造函数的输入值,我需要调用不同的 Base class 构造函数。

如:

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 魔法。

编辑:此外,我不想使用 "init" 函数,该函数根据参数的值进行不同的初始化。

这确实是一个很奇怪的要求,也许你应该重新考虑一下一般的做法。这个特定的 42 值是什么意思? 问题是什么,答案是 42? 也许你应该有两个兄弟姐妹 Derived,或者子class Derived [=15] =] case 或 x!=42 case 等。或者 42 来自不同类型的对象,您可以为该类型使用单独的构造函数?

但是如果您确实想完成您所要求的,一种可能的方法是在 Derived 中有两个不同的构造函数和一个 "named constructor" (静态函数)在它们之间进行路由。类似的东西(没有检查可编译性,但想法应该很清楚):

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);

为此你还需要复制构造函数,但你也可以return指针等

另一种方法,如果 42 的值在编译时是固定的,则使用模板并专门化构造函数,甚至 class 用于特定值 42。

另一种我认为应该可行的方法,要求基础 class 是可复制或可移动构造的:

struct Derived {
    Derived(int x): Base( (x == 42)? Base() : Base(x) ) {}
};