999
以下代码正确地将值和“ ”吐出test
到控制台,但我该如何返回这些值呢?像注释行之类的东西是我的最终目标。返回我可以分配给自动变量的值(因为我不知道我将要处理的类型)。我打算使用boost::lexical_cast
将此值转换为 astd::string
以将其插入到数据库中的字段中。
我尝试了其他示例中访问者的各种变体,但均未成功,包括DataMap
从基类派生,以便我可以将变量存储为成员。我的尝试最终没有成功。
任何建议表示赞赏。谢谢。
#include "stdafx.h"
#include "boost\variant.hpp"
#include <iostream>
#include <map>
struct DataMap
{
DataMap() {};
typedef std::map<std::string, std::map<std::string,
boost::variant<int, std::string>>> ArtifactMap;
ArtifactMap::const_iterator begin() const { return _data.begin(); }
ArtifactMap::const_iterator end() const { return _data.end(); }
ArtifactMap _data;
};
struct DataMapVisitor : public boost::static_visitor<>
{
template<typename T>
void operator()(const T& t) const { std::cout << t << std::endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
DataMap dataMap;
std::map<std::string, boost::variant<int, std::string>> columns;
columns.insert(std::make_pair("Col1", 999));
columns.insert(std::make_pair("Col2", "test"));
dataMap._data.insert(std::make_pair("Table1", columns));
for (auto table : dataMap)
{
for (auto column : table.second)
{
boost::apply_visitor(DataMapVisitor(), column.second);
//auto value = boost::apply_visitor(DataMapVisitor(), column.second);
}
}
return 0;
}
编辑:作为更新,以下代码让访问者正确返回std::string
. 我猜没有办法让一个访问者返回多种值类型(即,string
如果是 a 则string
返回值,如果是 a 则返回int
值int
等)?
class DataMapVisitor : public boost::static_visitor<std::string>
{
public:
template<typename T>
std::string operator()(const T& value) const
{
try
{
return boost::lexical_cast<std::string>(value);
}
catch (boost::bad_lexical_cast&)
{
return "";
}
}
};