3
以下代码正确地将值999
和“test
”分配给控制台,但我该如何返回这些值?像评论界线这样的东西是我的最终目标;返回值然后我可以分配给一个自动变量(因为我不知道我将处理的类型)。我打算使用boost::lexical_cast
将此值转换为std::string
以将其插入到数据库的字段中。如何从boost :: apply_visitor返回模板值?
我已经尝试过其他示例中访问者的各种变体,但没有成功,包括从基类派生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
,则返回string
值,如果返回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 "";
}
}
};