boost::variant
のコンバージョンとC++のstd::vector
の組み合わせに関する質問です。私のプロジェクトでは、SQLの出力としてバリアントを使用します。私は常に1種類のバリアントを使用します。私は何をしようとしていることは私の選択の同等のタイプに変異体、バリアント又は変異体の2xvectorのベクトルから容易に変換することです。単純に、私はの線に沿って何か必要があります。ここではまずバリアント、ベクトル<variant>とベクトル<ベクター<variant>>を私の選択と同等のタイプに変換する
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に依存します。私は私の答えは次のようになりますことを知って、次のpostから:
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;
}
意図したとおりに動作していないとして、残念ながら私はこれでしばらく立ち往生されており、さらにはコンパイルされません。
'boost :: variant'は一度' std :: string'を保持し、もう一つは同じ 'std :: vector'に' int'を入れることは可能でしょうか? – Exagon
ああ、それは完全に可能です。しかし、私のベクトルは常に同じタイプを保持します。 –
'std :: vector my_variable = convert(some_variant_vector)'を呼び出すと、 'some_variant_vector'に' int'を持つすべてのバリアントのint値を取得しますか? –
Exagon