我的问题涉及C++中boost::variant
转换与std::vector
的混合使用。在我的项目中,我使用变量作为SQL的输出。我将始终只使用一种类型的变量。我想做的是从变量、变量向量或2x变量向量轻松地转换为我选择的等效类型。天真地说,我需要以下内容:
std::vector < int > my_variable = convert(some_variant_vector)
首先介绍一下我的设置:
#include "boost\variant.hpp"
#include "boost\date_time\gregorian\gregorian.hpp"
typedef boost::variant< int, std::string, boost::gregorian::date> _var;
typedef std::vector<_var> _vec_var;
typedef std::vector<_vec_var> _vec2_var;
我希望有一种简单的方法,可以根据我的需要将
_var
(或_vec_var
或_vec2_var
)转换为int / string / date。从以下文章中,我知道我的答案应该类似于这样:template<typename T>
struct converter_visitor : public boost::static_visitor<T>
{
const _var &converter;
converter_visitor(const _var &r) : converter(r) {}
T operator()(const _var &) const{
return boost::get<_var>(converter);
}
const _vec_var &v_converter; // case of vector<>
converter_visitor(const _vec_var &r) : v_converter(r) {}
T operator()(const _vec_var &) const{
T ans;
ans.reserve(_cont.size());
for (int i = 0; i < _cont.size(); ++i)
ans.push_back(boost::get<T>(v_converter[i]));
return ans;
}
const _vec2_var & v2_converter; // case of vector<vector>
converter_visitor(const _vec2_var &r) : v2_converter(r) {}
T operator()(const _vec2_var &) const {
T ans;
ans.reserve(v2_converter.size(), v2_converter[0].size());
for (int i = 0; i < _cont.size(); ++i)
{
for (size_t j = 0; j < v2_converter[0].size(); j++)
{
ans.push_back(boost::get<T>(v2_converter[i][j]));
}
}
return ans;
}
};
int main()
{
_var variable = 1;
int integer_conversion;
boost::apply_visitor(converter_visitor(test), integer_conversion);
return 0;
}
很不幸,我已经被这个问题困扰了一段时间,因为它不能按照预期工作,甚至无法编译。
std::vector
中,boost::variant
是否可能一次保留一个std::string
,另一次保留一个int
? - Exagonstd::vector <int> my_variable = convert(some_variant_vector)
,您希望获得在some_variant_vector
中持有int
的所有变量的 int 值? - Exagonbool_visitor<T>
,如果一个boost::variant
包含T
,则返回true
,否则返回false
。然后使用std::remove
删除所有不包含T
的变量,再使用std::transform
将向量中的所有变量转换为它们所持有的类型。 如果这对您有用,我会尝试一下。 - Exagon