根据输入参数值调用不同的基础 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) ) {}
};
我有以下场景:
根据 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) ) {}
};