다음 코드는 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 "";
}
}
};