我目前正在尝试像这样将任意数量的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,它说



microsoft.com



所以,我的问题是:fprintf如何格式化或转换其参数?是否使用运算符?它使用 Actor 表吗?

最佳答案

fprintf是从C继承的函数。尤其是,它采用C可变参数:int fprintf(FILE*, const char*, ...)

您只能将内置C类型传递给此类函数,甚至不能将用户定义的C类型传递给该函数。尝试这样做的是未定义行为。尝试传递MyType很危险(例如,您提到的string不允许使用)。传递std::initializer_list<T>始终是未定义行为。

如Jarod在评论中所述,请使用std::cout <<。如果需要更高级的格式,请使用Boost.format

09-10 05:17
查看更多