gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:34:24 31 4
gpt4 key购买 nike

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

最佳答案

如果你想返回的东西是变体的,你可以把它作为一个变体退回。希望这能回答您的问题。

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

关于boost-variant - 如何从 boost::apply_visitor 返回模板值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27977787/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com