c ++将格式化的字符串作为参数传递给函数

时间:2014-06-13 14:55:06

标签: c++

好吧,这真的不难,但经过多次尝试,我找不到任何解决方案。

如何将格式化字符串传递给1行中的函数?我想有一个简单的方法,我可以用于记录/调试目的,如下所示:

void debug(string s){
    if (DEBUG) cerr << s;
}

我希望能够将格式化的字符串发送到此函数,如下所示:

debug("reading %s" % fname);

我的主要目标是在调试方法中加入尽可能多的功能,这样每当我想把东西写入stderr时,我就可以让生活变得更轻松。

printf解决方案似乎需要大量的代码来进行简单的格式化,而boost :: format似乎会返回一些模糊的类型,这些类型不能轻易用作参数而不包含一些.str()内容。

我是否懒得成为一名C ++程序员,还是有一种完整的方法可以实现我尚未发现的目标?

3 个答案:

答案 0 :(得分:4)

您可以使用__VA_ARGS __:

在fprintf周围定义宏
#define DBGLOG(format, ...) if(DEBUG){ fprintf(stderr, "%s -- %d -- ", __FUNCTION__, __LINE__); fprintf(stderr, format, ##__VA_ARGS__);}

如果DEBUG为真,则输出函数名称和行号,然后输出您想要打印的内容。

例如:

DBGLOG("%d\n", some_integer);

这会将函数和行号添加到整数值并打印出来。

答案 1 :(得分:1)

您可以编写一个接受格式的函数并将其传递给您的其他函数:

void debug( std::string s )
{
    if (DEBUG) cerr << s; 
}

void debug( boost::format format )
{
     debug( format.str() );
}

答案 2 :(得分:0)

这里的普通C ++解决方案略有不同:您的debug 函数应返回std::cerr周围的包装器(或任何 其他输出流),类似于:

class OStreamWrapper
{
    std::ostream* myStream;
public:
    OStreamWrapper( std::ostream* init ) : myStream( init ) {}
    template <typename T>
    OStreamWrapper& operator<<( T const& value )
    {
        if ( myStream != nullptr ) {
            *myStream << value;
        }
    }
};

OStreamWrapper
debug()
{
    return OStreamWrapper( DEBUG ? &std::cerr : nullptr );
}

然后使用它:

debug() << "reading " << fname << '\n';

这具有实际转换的附加优势 除非调试,否则不需要格式化输出 活性