【问题标题】:How to return Template Value from boost::apply_visitor?如何从 boost::apply_visitor 返回模板值?
【发布时间】:2015-01-16 05:25:27
【问题描述】:

以下代码正确地将值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 "";
      }
   }
};

【问题讨论】:

    标签: boost-variant apply-visitor


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 2013-02-18
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多