为什么以下打印出来"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或者没有给出相同的结果)
这个简单的示例代码为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) 昨天我问了这个问题并且"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)
你能告诉我这里有什么问题吗?
我是否需要使用诸如class Visitor : public boost::static_visitor<>boost :: variant之类的访问者类?
如果没有,有没有理由不使用访客?是否有理由喜欢访客班?
我问这个问题,因为访问者类似乎是使用boost :: variant的一个多余方面.
我正在尝试使用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)