12
typedef boost::variant<int, double> Type;
class Append: public boost::static_visitor<>
{
public:
    void operator()(int)
    {}

    void operator()(double)
    {}

};

Type type(1.2);
Visitor visitor;
boost::apply_visitor(visitor, type);

次のように、追加のデータを受け取るようにビジターを変更することは可能ですか?

class Append: public boost::static_visitor<>
{
public:
    void operator()(int, const std::string&)
    {}

    void operator()(double, const std::string&)
    {}
};

この文字列値は、Append オブジェクトの有効期間中に変更されます。この場合、コンストラクターを介して文字列を渡すことはできません。

4

3 に答える 3

19

各呼び出しに与えられる「追加の引数」はthisポインターです。これを使用して、必要な追加情報を渡します。

#include <boost/variant.hpp>
typedef boost::variant<int, double> Type;
class Append: public boost::static_visitor<>
{
public:
    void operator()(int)
    {}

    void operator()(double)
    {}
    std::string argument;
};

int main() {
    Type type(1.2);
    Append visitor;
    visitor.argument = "first value";
    boost::apply_visitor(visitor, type);
    visitor.argument = "new value";
    boost::apply_visitor(visitor, type);
}
于 2012-10-18T12:49:37.093 に答える
1

これはあなたの問題を解決します:

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

typedef boost::variant<int, double> Type;
typedef boost::variant<const std::string> Extra;
class Append: public boost::static_visitor<>
{
public:
    void operator()(const int& a1, const std::string& a2) const {
        std::cout << "arg 1 = "<< a1 << "\n";
        std::cout << "arg 2 = "<< a2 << "\n";
    }

    void operator()(const double& a1, const std::string& a2) const {
        std::cout << "arg 1 = "<< a1 << "\n";
        std::cout << "arg 2 = "<< a2 << "\n";
    }
};

int main()
{
    Type type(1.2);
    Extra str("extra argument");
    boost::apply_visitor(Append(), type, str);
}

ここに作業がありDemoます。追加の引数を必要な数だけ送信できます。制限は、boost::variant 内にラップする必要があることです。ただし、コンパイラは、内部に単一の型を持つバリアントを最適化します。2 つ以上の引数が必要な場合は、 https://www.boost.org/doc/libs/1_70_0/doc/html/boost/apply_visitor.html#include <boost/variant/multivisitors.hpp>を参照してください。

于 2019-06-08T16:16:33.490 に答える