如何从boost :: apply_visitor返回模板值?

时间:2015-01-16 05:25:28

标签: boost-variant apply-visitor

以下代码正确地吐出值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}}

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