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

Fer*_*eak 5 c++ constructor derived-class

我有以下场景:

根据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);
}
Run Code Online (Sandbox Code Playgroud)

根据我目前对C++的了解,我认为这是不可能的,所以我问社区他们是否知道任何黑客或脏代码会使这个可行.请不要让简单int的误导你,现实生活场景要复杂得多.随意混合使用C++ 11 magic.

编辑:另外,我不想使用"init"函数,它根据参数的值初始化不同的东西.

Pet*_*etr 7

这确实是一个非常奇怪的请求,也许你应该重新考虑一般方法.这个特定42值的含义是什么?问题是42是什么问题?也许你应该有两个兄弟DerivedS,或子类Derivedx==42情况下或x!=42情况,等等.或者也许42来自不同类型的对象,你可以使用一个单独的构造该类型?

但是如果你确实想要完成你所要求的,一种可能的方法是在两个不同的构造函数Derived和一个"命名构造函数"(静态函数)之间进行路由.类似的东西(没有检查可兼容性,但想法应该是明确的):

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);
Run Code Online (Sandbox Code Playgroud)

为此,您还需要复制构造函数,但您也可以返回指针等.

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

我认为应该工作的另一种方法,要求基类可以复制或移动构造:

struct Derived {
    Derived(int x): Base( (x == 42)? Base() : Base(x) ) {}
}; 
Run Code Online (Sandbox Code Playgroud)