尝试重现在 C# 中你会做这样的事情:
string FormatString(params object[] args) {
return string.Format(CultureInfo.InvariantCulture, args);
}
在 Obj-c 中它看起来像这样:
#include <stdarg.h>
void logObjects(id firstObject, ...) {
va_list args;
va_start(args, firstObject);
id obj;
for (obj = firstObject; obj != nil; obj = va_arg(args, id))
NSLog(@"%@", obj);
va_end(args);
}
logObjects(@"foo", [NSNumber numberWithInt:4], @"bar", nil);
我熟悉可变参数长度但不太确定如何存储 args 然后将它们发送到 std::cout。这可能吗?
注意!我想发送任何可以处理 << 运算符的对象。只需将此功能视为以下功能的替代品:
std::cout << "test" << someObject << int << someOtherObject;
我正在使用 boost 并希望它保持平台独立性。此函数将成为共享库中日志记录类的一部分。
最佳答案
它在 C# 中也不起作用,因为无论如何概念都清楚,格式字符串丢失了。在 C 中,您可以执行类似的操作(如 dbgprint 中所示,如果您具有可变宏功能)
#define printfex(...) printf(__VA_ARGS__)
如果你有幸使用C++11你可以写这个原型(prototype):
template<class... T>
void printfex(const std::string& format, T... args);
关于c++ - 处理未知数量的 undefined object 以进行记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711562/