2015-01-16 8 views
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 ""; 
     } 
    } 
}; 

답변

1

반환하려는 항목이 변형 인 경우 변형으로 되돌릴 수 있습니다. 바라건대, 그 질문에 대한 답변.

#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; 
}