6

本気で「ドッ!」って感じです。ここで一瞬…

私は現在実装しようとしています:

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 に答える