gpt4 book ai didi

c++ - 更好的#define print std::cout<
转载 作者:行者123 更新时间:2023-11-28 02:47:43 26 4
gpt4 key购买 nike

为了快速插入简短的调试语句我想转

print("%d %d %s") % i % j % str;

进入更冗长

std::cout << boost::format("%d %d %s") % i % j % str << std::endl;

提到的#define print std::cout<<boost::format没有 endl,所以即使我在字符串中添加“\n”,如果下一行发生崩溃,缓冲区也不会刷新。

更像 C++ 的方法 print("string)返回一个 xPrint 实例并重载 xPrint::operator%不起作用,因为我无法知道最后一次 % 是什么时候调用已经完成,是时候打印生成的格式字符串了。

注意:我需要 boost::format,所以 printf/fflush 不行,我希望生成的语法简短。

最佳答案

我会建议类似的东西

#define print(x) std::cout << (x) << std::endl

它允许你做

print(boost::format("%s") % str);

如果你真的坚持上面给出的简短版本,我能想到的最接近的是:

#include <iostream>
#include <boost/format.hpp>

class Forwarder
{
public:
Forwarder(const std::string& s)
: f(s)
{}

template <typename T>
Forwarder& operator%(const T& t)
{
f % t;
return *this;
// You could even return a reference to f here instead if you wanted
}

~Forwarder()
{
std::cout << f << std::endl;
}

private:
boost::format f;
};

#define print(x, y) { Forwarder f(x); f % y; }

int main()
{
std::string str("Hallo");
int i = 123, j = 456;
print("%s %d %d", str % i % j);
}

编辑 这里有更多(有潜在危险!)的想法来破解这样的打印语句。下面的代码只是为了展示概念,不会按原样编译。使用风险自负!

a) 通过为 operator% 添加特化而不是使用析构函数来触发打印,向 Forwarder 添加终止语句:

将帮助程序结构定义为终止符(最好在命名空间中,但你明白了......):

struct END {};

专门化模板:

template <>
Forwarder& Forwarder::operator%<END>(const END& t)
{
std::cout << f << std::endl;
return *this;
}

用法:

print("%s %d %d") % str % i % j % END;

b) 使用绑定(bind)不太严格且从右到左结合性的运算符。您必须引入一个辅助类型,尽管它可能是某种日志记录目标。

void operator<<=(Logger& l, const Forwarder& f) { ... }

用法:

DebugLogger <<= Forwarder("%s %d %d") % str % i % j;

c) 与上面相同,但使用具有从左到右关联性的逗号运算符(糟糕!)。

void operator,(const Forwarder& f, Logger& l) { ... }

用法:

Forwarder("%s %d %d") % str % i % j, DebugLogger;

关于c++ - 更好的#define print std::cout<<boost::format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23873334/

26 4 0

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com