以下代码正确地吐出值999
和" test
"到控制台,但我如何返回这些值?像评论线这样的东西是我的终极目标;返回我可以分配给自动变量的值(因为我不知道我将要处理的类型)。我计划使用boost::lexical_cast
将此值转换为std::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
则返回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 "";
}
}
};
值它是{{1}}等)?
{{1}}
答案 0 :(得分:2)
如果您要返回的内容是变体,则可以将其作为变体返回。希望这能回答你的问题。
#include <boost\variant.hpp>
#include <iostream>
#include <map>
typedef boost::variant<int, std::string> TVariant;
struct DataMap
{
DataMap() {};
typedef std::map<std::string, std::map<std::string, TVariant>> 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<TVariant>
{
template<typename T>
TVariant operator()(const T& t) const {
std::cout << t << std::endl;
return t;
}
};
int main(int argc, char** args)
{
DataMap dataMap;
std::map<std::string, TVariant> 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;
}