【发布时间】:2017-10-18 19:53:38
【问题描述】:
我正在设置一个控制台命令,它接受可变数量的参数,每个参数都可以是基本类型(int、float、bool、string),然后将它们传递给具有 8 个重载的函数以支持不同的不同类型的参数的数量。如何根据类型将命令行字符串解析为值,然后将它们传递给函数?
我可以通过函数const char* GetArg(int index) 检索每个参数。将char* 转换为正确的类型不是问题,所以不要担心那部分。存储值并以某种方式传递给模板函数是我坚持的部分。
例如,如果使用以下字符串执行命令:"command 66 true 5 "string value" 0.56"
然后它将被分解为以下参数并以某种方式存储:
int arg1 = GetArg(1); // 66
bool arg2 = GetArg(2); // true
int arg3 = GetArg(3); // 5
char* arg4 = GetArg(4); // "string value"
float arg5 = GetArg(5); // 0.56
然后根据args的个数,调用正确的模板函数:
// The function definition looks something like this:
void SomeFunc();
template<typename T1>
void SomeFunc(const T1& arg1);
template<typename T1, typename T2>
void SomeFunc(const T1& arg1, const T2& arg2);
// etc...
// And then somehow it would be called. This is just an example. I don't
// know how to call it in a way that would work with variable number and
// type of args.
switch (argCount)
{
case 0:
SomeFunc();
break;
case 1:
SomeFunc(arg1);
break;
case 2:
SomeFunc(arg1, arg2);
break;
case 3:
SomeFunc(arg1, arg2, arg3);
break;
case 4:
SomeFunc(arg1, arg2, arg3, arg4);
break;
case 5:
SomeFunc(arg1, arg2, arg3, arg4, arg5);
break;
}
您将如何做到这一点?以某种可以传递给模板函数的方式存储参数,以便它知道每个参数的类型似乎是不可能的,但我觉得我只是没有想到什么。
我也无法更改此界面。这是我必须处理的第三方功能。所以不管怎么实现,最终都要经过SomeFunc()。
重要提示:我在 Visual Studio 2012 中执行此操作,因此我对较新的 C++ 功能相当有限。它可以做一点 C++11,但仅此而已。尝试将项目升级到较新的版本,但现在这是我必须处理的。
【问题讨论】:
-
听起来您正在尝试混合编译时和运行时逻辑。模板是编译时的,你需要在编译时知道参数的数量和它们的类型。这真的是您想要实现的其他目标吗?
-
好吧,如果你可以构建一个元组,那么你可以使用this 将元组变成一个函数调用。
-
@TommyAndersen 这听起来很准确。我真的没有办法解决这个问题。我只是想制作一个辅助控制台命令来轻松触发事件,每个事件可以有可变数量的参数和类型。如果情况失控,我可能会放弃这个想法,现在看来可能是这样。
-
@NathanOliver 这太棒了!但是我不是必须为 args 数量及其类型的组合的每个排列构建一个元组吗?这是一个疯狂的元组数量。这是这个问题的很大一部分,我不知道如何处理。即使我能弄清楚每个参数的类型,我也不知道如何将它们存储在某个公共容器中,因此它不需要大量的排列。
-
好的,我可能会反对这个想法,因为它似乎不可能。我会坚持支持不传递任何参数。它只是用于调试和测试,所以不是超级重要:) 谢谢大家的信息!
标签: c++ templates visual-studio-2012 args variadic