如何重载带有可变数量参数的函数

我需要区分(重载)两个函数——一个接受一个const char*参数,另一个接受至少两个参数——一个const char*后跟一个或多个参数。即基本上:

void f(const char *str);
void f(const char *format, ...)

我想要第一个版本被调用,f("hello")第二个版本被调用f("hello %d", 10)。上述重载将不起作用,因为编译器发现f("hello")歧义。

所以我试过这个:

void f(const char *str);

template<typename T>
void f(const char *str, T tt, ...);

这使得重载解析正常工作。但我最终遇到了另一个问题。第二个函数应该转发 printf 样式使用的参数。所以我有类似的东西:

template <typename T>
void f ( const char *format, T tt, ... )
{
    (T)tt;
    va_list varlist;
    va_start(varlist, format);
    vprintf(format, varlist);
    va_end(varlist);
}

现在第二个参数tt不再是变量参数列表的一部分,并且调用va_start()withformat 似乎不起作用。

有什么办法可以实现我想要的吗?

回答

如果您使用 vararg 模板,您可以完成您想要的:

#include <iostream>

void f(const char* str)
{
    std::cout << "single arg: " << str << "n";
}

template <typename ...T>
void f(const char *format, T... args)
{
    printf(format, args...);
}

int main()
{
    f("hello");
    f("formatted %d", 10);
}


以上是如何重载带有可变数量参数的函数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>