2015-01-16 40 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; 
}