我一直在stackoverflow中搜索这个,但我无法理解大多数提出的解决方案。问题是我需要编写一个可以接受任何数据类型的函数,函数的参数数量也各不相同。现在我只想在函数中打印这些参数。
void printVariableArgs(){
//print all variables that are passed to this function
}
是否可以在c ++中执行此操作,如果是这样,它是如何完成的?
答案 0 :(得分:2)
C ++ 11有variadic templates。
以下是使用它们的printf示例:
void printf(const char *s)
{
while (*s) {
if (*s == '%' && *(++s) != '%')
throw std::runtime_error("invalid format string: missing arguments");
std::cout << *s++;
}
}
template<typename T, typename... Args>
void printf(const char *s, T value, Args... args)
{
while (*s) {
if (*s == '%' && *(++s) != '%') {
std::cout << value;
++s;
printf(s, args...); // call even when *s == 0 to detect extra arguments
return;
}
std::cout << *s++;
}
throw std::logic_error("extra arguments provided to printf");
}
您可以随时直接使用printf。
还有stdarg.h变量参数:
/* print all non-negative args one at a time;
all args are assumed to be of int type */
void printargs(int arg1, ...)
{
va_list ap;
int i;
va_start(ap, arg1);
for (i = arg1; i >= 0; i = va_arg(ap, int))
printf("%d ", i);
va_end(ap);
putchar('\n');
}
答案 1 :(得分:0)
第一个参数不能是任意的,您应该有一些方法来确定其他参数的类型(因为例如double
和int
以不同方式传递并具有不同的大小)。 printf
可能是一种灵感(它的第一个参数是描述下一个参数的格式字符串)。
然后查看va_arg
使用它可能被认为是不好的,因为你丢失了编译器完成的所有类型检查。
另请参阅Pubby关于可变参数模板的好答案(您在C ++ 11中只有这些模板)。
答案 2 :(得分:0)
aaa我知道你可以定义一个模板。看这个:
void T func (T x)
{
return T-object;
}
在这种情况下,您可以将int传递给函数并返回int,或者传递一个float,函数返回float对象。
但我不知道如何将不同数量的变量传递给function.sorry
答案 3 :(得分:0)
如果您有某种方法可以确定这些函数的数据类型,例如使用格式字符串,则可以创建类似于printf
的函数。
根据您要完成的操作,您还可以创建基类并传递该派生类型的数组,每个数组都覆盖print()
方法。您显然也可以在新的C ++标准中使用 Variadic 函数,但我以前从未使用过它们。
即使有上述两个选项,也无法满足每种数据类型。也许你可以解释一下你想要做什么以及为什么我们可以提供替代方案。