特殊的限制,只能有一个构造函数。这是我能想到的最接近的:
#include <iostream>
// cheap and cheerful Boost.Variant
struct StringOrInt {
char *s;
int i;
bool is_string;
StringOrInt(char *s) : s(s), i(0), is_string(true) {}
StringOrInt(int i) : s(0), i(i), is_string(false) {}
bool isInt() { return !is_string; }
int asInt() { return i; }
char *asString() { return s; }
};
struct Foo {
int m1;
char *m2;
int m3;
Foo(int arg1, StringOrInt arg2 = "arg2", int arg3 = 1) : m1(arg1) {
if (arg2.isInt()) {
arg3 = arg2.asInt();
arg2 = "arg2";
}
m2 = arg2.asString();
m3 = arg3;
}
void print() {
std::cout << m1 << " " << m2 << " " << m3 << "\n";
}
};
int main() {
Foo(1, "HelloWorld").print();
Foo(1, 2).print();
}
注意与GCC这会产生警告,因为从一个字符串到非const char*
转换已被弃用,不明智的。但这是你要求的,并修复它,以便char*
参数和数据成员是const char*
很容易。
一个显着的弱点是,这并不能阻止你写Foo(1,2,3)
。要在编译时检查,我认为你需要多个构造函数。要在运行时检查它,可以将第三个参数设置为另一个类,其中Default
是仅用于此目的的类型,仅支持一个用作arg3
的默认值的值。那么,如果arg2.isInt()
为真,则检查arg3.isInt()
是否为假,如果不是则拒绝logic_error
。
您不能在C++中使用单个函数定义来完成此操作。鉴于任何其他解决方案违反了你所拥有的奇怪限制,你想要的是不可能的。也许你可以使用不同的语言。 –
正在做作业吗? – xmoex
你不能使用对象的'vector'吗?这样你就可以传递你想要的东西,并根据'null'条目对没有传递的东西进行排序。 – MoonKnight