我正在做的事情,讓我更容易調用腳本語言(Lua)函數,一個想法是使用可變參數。有兩種方法可以做到這一點:如何將可變參數轉換爲容器類?
Call(int count, ...)
和
Call(const char* args, ...)
如printf。我認爲第一個維護起來會容易一些,所以我試圖通過製作一個包裝來管理參數類型。它看起來像這樣:
class ArgWrapper
{
public:
ArgWrapper();
ArgWrapper(const int& v) { val.i = v; type = INT; }
ArgWrapper(const bool& v) { val.b = v; type = BOOL; }
ArgWrapper(const float& v) { val.f = v; type = FLOAT; }
ArgWrapper(const double& v) { val.d = v; type = DOUBLE; }
operator int() { return val.i; }
operator bool() { return val.b; }
operator float() { return val.f; }
operator double() { return val.d; }
enum {
INT,
BOOL,
FLOAT,
DOUBLE
} type;
union
{
int i;
bool b;
float f;
double d;
} val;
};
這工作得很好,很正常,但是當我真正嘗試做一個varadic論證建設這項工作,事實證明,這些值沒有實際鑄造。
void printArgs(int c, ArgWrapper...)
{
va_list ap;
va_start(ap, c);
for (int i = 0; i < c; i++)
{
ArgWrapper arg = va_arg(ap, ArgWrapper);
if (arg.type == arg.INT) std::cout << "integer - " << (int)arg << std::endl;
if (arg.type == arg.BOOL) std::cout << "boolean - " << std::boolalpha << (bool)arg << std::endl;
if (arg.type == arg.FLOAT) std::cout << "float - " << (float)arg << std::endl;
if (arg.type == arg.DOUBLE) std::cout << "double - " << (double)arg << std::endl;
}
va_end(ap);
}
...
printArgs(4, 1337.0f, 18, 37.0, true);
上述結果中的垃圾,而這工作完全正常:
printArgs(4, (ArgWrapper)1337.0f, (ArgWrapper)18, (ArgWrapper)37.0, (ArgWrapper)true);
如何指定每個參數可變參數應該具有相同的常見的類型?