【发布时间】:2021-03-24 10:01:18
【问题描述】:
我需要区分(重载)两个函数 - 一个接受单个 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 不再是变量参数列表的一部分,并使用format does not seem to work 调用va_start()。
有什么方法可以实现我想要的吗?
【问题讨论】:
-
不要重新发明轮子,只需使用
fmt库,它主要是 C++20 的一部分。 -
@MarekR 不幸的是,我仅限于 c++17 编译器。
-
AFAIK fmt 支持 C++11,它只是部分包含在新标准中。我在所有桌面平台上广泛使用 C++17。
标签: c++ overloading variadic-functions