我目前正在尝试将MyType
的任意数量的参数传递给fprintf
,如下所示:
void myPrint(const char* fmt, std::initializer_list<MyType> args)
{
fprintf(stdout, fmt, args);
}
其中MyType
基本上是一个变体,可以从最常见的类型构造(int,string,uint *,bool,...)。现在这样调用myPrint(...)
myPrint("I am a hex int: %x", { 5 } );
这将始终打印initializer_list
的地址。查看参考文献时,例如cplusplus.com,它说
[...]如果格式包含格式说明符(以%开头的子序列),则格式为的其他参数将格式化为,并插入到结果字符串中,替换它们各自的说明符。 [...]
[...]每个函数参数(如果有的话)被转换并根据格式的相应格式规范输出。 [...]
所以,我的问题是:fprintf
格式或如何转换其参数?它是否使用运营商?它是否使用演员表?
答案 0 :(得分:1)
fprintf
是从C继承的函数。特别是,它采用C variadic参数:int fprintf(FILE*, const char*, ...)
。
您只能将内置C类型传递给此类函数,甚至不能传递用户定义的C类型。尝试这样做是未定义的行为。尝试传递MyType
是危险的(例如,您提及的string
是不允许的)。传递std::initializer_list<T>
总是未定义的行为。
正如Jarod在评论中所述,使用std::cout <<
。如果您需要更高级的格式,请使用Boost.format
。