特殊的限制,只能有一個構造函數。這是我能想到的最接近的:
#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