gpt4 book ai didi

c++ - boost::format 和自定义打印标准容器

转载 作者:可可西里 更新时间:2023-11-01 16:02:35 27 4
gpt4 key购买 nike

我的命名空间中有一个函数 ns这有助于我打印 STL 容器。例如:

template <typename T>
std::ostream& operator<<(std::ostream& stream, const std::set<T>& set)
{
stream << "{";
bool first = true;
for (const T& item : set)
{
if (!first)
stream << ", ";
else
first = false;
stream << item;
}
stream << "}";
return stream;
}

这非常适合使用 operator << 进行打印直接:

std::set<std::string> x = { "1", "2", "3", "4" };
std::cout << x << std::endl;

但是,使用 boost::format是不可能的:

std::set<std::string> x = { "1", "2", "3", "4" };
boost::format("%1%") % x;

问题相当明显:Boost 不知道我希望它使用我的自定义 operator <<打印与我的命名空间无关的类型。在添加 using 之外申报成boost/format/feed_args.hpp ,有没有方便的方法来制作boost::format寻找我的 operator <<

最佳答案

我实际使用的解决方案与 Answeror 的非常相似,但它适用于任何东西:

namespace ns
{

template <typename T>
class FormatWrapper
{
public:
explicit FormatWrapper(const T& x) :
ref(x)
{ }

friend std::ostream& operator<<(std::ostream& stream,
const FormatWrapper<T>& self
)
{
// The key is that operator<< is name lookup occurs inside of `ns`:
return stream << self.ref;
}
private:
const T& ref;
};

template <typename T>
FormatWrapper<T> Formatable(const T& x)
{
return FormatWrapper<T>(x);
}

}

所以用法是:

boost::format("%1%") % Formatable(x);

关于c++ - boost::format 和自定义打印标准容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808446/

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