標準の組み込み型へのポインタを含むboost :: variant型のstd :: vectorがあります。std :: vectorの内部にポインタを含むboost :: variantを設定する
コードでstd::vector<boost::variant<int *, double *> > bv;
bv.resize(2);
int n = 42;
bv[0] = &n;
double d = 102.4;
bv[1] = &d;
これはうまく機能し、そしてIはboost::get<int *>
又はboost::get<double *>
を使用して、ベクター内の値にアクセスすることができます。
しかし、リファレンスを指すのではなく、ベクトルの要素の値を直接設定できるかどうかは疑問でした。言い換えれば、私はこのようなことをしたいと思います。
*bv[0] = 42;
*bv[1] = 102.4;
これはコンパイルされません。誰かがこれについてどうやって行くのかアドバイスを持っていますか?
ありがとうございました。
EDIT:
どうやら、私は自分の質問に答えるために十分なポイントを持っているので、私が代わりに元の質問に私の解決策を置くところ考え出しません。これは、このページを跨いで誰かを助けることを願っています。
誰かを助ける場合に備えて、自分の質問に答えると思いました。バリアントのポインタが何を参照するのかを変更するvisitorクラスを作成しました。ここではビジタークラスのコードを示します(もちろん、これはテンプレートクラスにすることができます)。
class specific_visitor : public boost::static_visitor<>
{
public:
explicit specific_visitor(int i) : i_num(i) { }
explicit specific_visitor(double d) : d_num(d) { }
void operator()(int * i) const
{
*i = i_num;
}
void operator()(double * d) const
{
*d = d_num;
}
private:
int i_num;
double d_num;
};
元の質問では変異型のベクトルのためにそれを使用するためには、ここにコードがある:
int i_num = 34;
boost::apply_visitor(specific_visitor(i_num), bv[0]);
double d_num = 9.81;
boost::apply_visitor(specific_visitor(d_num), bv[1]);
ここでポインタを使用するのはなぜですか? –
さて、boost :: variantをより大きなプログラムに統合しようとしていますが、残念ながら、現時点で唯一現実的な選択肢です。 – endbegin
@endbegin:それは私には意味がありません。なぜ 'std :: vector>'それは非現実的なのでしょうか? –
kennytm