带有函数重载的变分宏
Variadic macros with function overloading
我有一个函数:
SendMsg(int x, string y, ...) { /*some code*/ }
我有一个宏:
FOO(X, STRING, ...) SendMsg(X, STRING "%s %d", ##__VA_ARGS__, "xyz", 123)
这样我就可以有这样的东西:
FOO(1000, "Note that line %d containing %d words is invalid", 5, 10);
扩展到
SendMsg(1000, "Note that line %d containing %d words is invalid" "%s %d", 5, 10, "xyz", 123);
有时我会有这样的东西:
FOO(1000, "String without variables");
应扩展为
SendMsg(1000, "String without variables" "%s %d", "xyz", 123)
到目前为止,宏运行良好。
但有时我会有这样的东西:
FOO(1000);
应扩展为
SendMsg(1000, "%s "%d", "xyz", 123);
但这并不奏效。我得到一个错误,"宏FOO需要3个参数,但只有1个给定"。有什么想法吗?
您需要做的是更改SendMsg的签名。
SendMsg(int x, char *secondFmt, char *xyx, int no123, ...)
{
// Print the string in buffer with ##__VA_ARGS__ using sprintf. first
// argument extracted from will be string only. otherwise sprintf will fail
va_start(args, no123);
const char *fmt = va_arg(args, const char *);
bytesWrote = sprintf(buffer, fmt, args);
sprintf(buffer + bytesWrote, secondFmt, xyz, no123);
va_end(args);
}
现在Foo看起来像
FOO(X, ...) SendMsg(X, "%s %d", "xyz", 123, ##__VA_ARGS__)
我所做的是先打印##__VA_ARGS__
的消息,然后打印"%s %d"
的部分。以相反的顺序向SendMsg提供参数。未测试,所以只调整代码。
如果您不想修改SendMsg,请查看下面的代码是否有效。
FOO(X, ...) {
va_start(args, no123);
const char *fmt = va_arg(args, const char *);
SendMsg(X, fmt "%s %d", "xyz", 123, args);
va_end(args);
}
如果没有,只需编写两个宏:
FOO_FMT(X, STRING, ...) SendMsg(X, STRING"%s %d", "xyz", 123, ##__VA_ARGS__)
FOO(X) SendMsg(X, "%s %d", "xyz", 123)
使用可变模板(C++11),您可能会执行重载,例如:
template <typename... Ts>
void FOO(int x, const std::string& format, Ts... args)
{
SendMsg(x, format + "%s %d", args..., "xyz", 123);
}
void FOO(int x)
{
SendMsg(x, "%s %d", "xyz", 123);
}
演示
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?