标签: apply-visitor

boost :: variant访问者选择了错误的重载

为什么以下打印出来"A boolean!"?我意识到有一些奇怪的转换,因为如果我显式构造一个std :: string,我会得到正确的行为.但是为什么visitor::operator()(bool)在下面的情况下选择重载决策呢?

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

typedef boost::variant<bool, std::string> type;

struct visitor : public boost::static_visitor<> {
    void operator()(bool b) const {
        std::cout << "A boolean!" << std::endl;
    }

    void operator()(const std::string& str) const {
        std::cout << "A string!" << std::endl;
    }
};

int main(int argc, char* argv[]) {
    type t = "I am a string";
    t.apply_visitor(visitor());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在运行Visual Studio 2012(CTP或者没有给出相同的结果)

c++ boost boost-variant apply-visitor

7
推荐指数
1
解决办法
393
查看次数

提升变量apply_visitor编译错误

这个简单的示例代码为boost :: variant和boost :: apply_visitor:

#include <boost/variant/recursive_variant.hpp>

struct ExprFalse;
struct ExprTrue;
struct ExprMaybe;

typedef boost::variant<
    ExprFalse,
    ExprTrue,
    ExprMaybe
    > Expression;

struct ExprFalse { };
struct ExprTrue { };
struct ExprMaybe { };

struct Printer : public boost::static_visitor<>
{
public:
    Printer(std::ostream& os) : m_os(os) { }
    void operator()(ExprFalse const& expr) const { m_os << "False"; }
    void operator()(ExprTrue const& expr) const { m_os << "True"; }
    void operator()(ExprMaybe const& expr) const { m_os << "Maybe"; }

private:
    std::ostream& m_os;
};

int …
Run Code Online (Sandbox Code Playgroud)

c++ macos boost variant apply-visitor

4
推荐指数
1
解决办法
963
查看次数

使用apply_visitor从变量的向量中过滤

昨天我问了这个问题并且"juanchopanza"回答了我的问题,但不幸的是我无法抓住其中一个有界类型.由于使用"访客"更加强大,我也想知道有人可以使用"访客"给我一个解决方案吗?

我正在寻找过滤boost变体矢量的最佳方法,该变量已定义如下:

 boost::variant<T1*, T2, T3> Var;
 std::vector<Var> Vec;
Run Code Online (Sandbox Code Playgroud)

当我调用这个向量时,什么是仅过滤T2有界类型并插入新向量的最佳方法?或者换句话说,我想要这样的东西

std::vector<T2> T2Vec =...(如何使用apply_visitor从Vec中过滤它)...

再次感谢!

编辑:@ ForEveR的闷闷不乐:

template<typename T>
struct T_visitor : public boost::static_visitor<>
{
   T_visitor(std::vector<T>& v) : vec(v) {}
   template<typename U>
   void operator () (const U&) {}
   void operator () (const T& value)
   {
      vec.push_back(value);
   }
private:
   std::vector<T>& vec;
};
Run Code Online (Sandbox Code Playgroud)

和:

  std::vector<T1> t1vec;
  T_visitor<T1> vis(t1vec);
  std::for_each(vec.begin(), vec.end(), boost::apply_visitor(vis));
Run Code Online (Sandbox Code Playgroud)

你能告诉我这里有什么问题吗?

c++ boost boost-variant apply-visitor

3
推荐指数
1
解决办法
580
查看次数

boost :: variant访客类是否需要?

我是否需要使用诸如class Visitor : public boost::static_visitor<>boost :: variant之类的访问者类?

如果没有,有没有理由不使用访客?是否有理由喜欢访客班?

我问这个问题,因为访问者类似乎是使用boost :: variant的一个多余方面.

c++ boost-variant apply-visitor

1
推荐指数
1
解决办法
265
查看次数

如何修改boost :: apply_visitor以返回值?

我正在尝试使用boost :: variant和boost :: apply_visitor.这已经有效了,除非我试图让Vistor的函数返回一个(布尔值).我在SO上做了很多这样的例子,但我无法创建一个工作样本.这是我的代码没有返回值:

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


class CnVisitor : public boost::static_visitor<>
{
public:
    void operator()(double& valueFloat ) const
    {
        std::cout << (double)valueFloat;
    }

    void operator()(std::string& valueString ) const
    {
        std::cout << valueString.c_str ();
    }
};


int main()
{
    std::vector< boost::variant< double, std::string >> vec;

    vec.push_back((double)1.423423);
    vec.push_back((std::string)"some text");

    CnVisitor l_Visitor;

    for ( int i = 0; i < vec.size (); ++i )
    {
        boost::apply_visitor ( l_Visitor, vec[i] );
    }

    _getch ();
}
Run Code Online (Sandbox Code Playgroud)

c++ boost-variant apply-visitor

1
推荐指数
1
解决办法
2861
查看次数

标签 统计

apply-visitor ×5

c++ ×5

boost-variant ×4

boost ×3

macos ×1

variant ×1