6

我觉得我有一个严重的“Doh!” 此刻……

我目前正在尝试实施:

std::ostream& operator<<(std::ostream &out, const MyType &type)

MyType 拥有 int、char 和 bool 的 boost::variant。IE:使我的变体可流式传输。

我试过这样做:

out << boost::apply_visitor(MyTypePrintVisitor(), type);
return out;

MyTypePrintVisitor 有一个模板函数,它使用 boost::lexical_cast 将 int、char 或 bool 转换为字符串。

但是,这不会编译,错误是 apply_visitor 不是 MyType 的函数。

然后我这样做了:

if(type.variant.type() == int)
out << boost::get<int> (type.variant);
// So on for char and bool
...

我缺少更优雅的解决方案吗?谢谢。

编辑:问题解决了。请参阅第一个解决方案和我对此的评论。

4

2 回答 2

7

variant如果所有包含的类型都是可流式传输的,您应该能够流式传输 a 。示范:

#include <boost/variant.hpp>
#include <iostream>
#include <iomanip>

struct MyType
{
    boost::variant<int, char, bool> v;
};

std::ostream& operator<<(std::ostream &out, const MyType &type)
{
    out << type.v;
}

int main()
{
    MyType t;
    t.v = 42;
    std::cout << "int: " << t << std::endl;

    t.v = 'X';
    std::cout << "char: " << t << std::endl;

    t.v = true;
    std::cout << std::boolalpha << "bool: " << t << std::endl;
}

输出:

int: 42
char: X
bool: true

如果您确实需要使用访问者(可能是因为某些包含的类型不可流式传输),那么您需要将其应用于variant自身;您的代码片段看起来像是将其应用于MyType对象。

于 2012-08-27T14:28:10.717 回答
1

不知道为什么,但这不适用于带有 C++17 的 clang 5.0。但我有另一个解决方案:

std::variant<int, char, bool> v;
std::visit(
    [](auto value) { std::cout << value << std::endl; },
    v
);
于 2018-02-22T18:24:56.757 回答