Как вернуть значение шаблона из boost::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 ответ
Если вещь, которую вы хотите вернуть, является вариантом, вы можете вернуть его как вариант. Надеюсь, это ответит на ваш вопрос.
#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;
}