標準の組み込み型へのポインターを含む、boost::variant 型の std::vector があります。
コード内
std::vector<boost::variant<int *, double *> > bv;
bv.resize(2);
int n = 42;
bv[0] = &n;
double d = 102.4;
bv[1] = &d;
これはうまく機能し、boost::get<int *>
orを使用してベクトル内の値にアクセスできますboost::get<double *>
。
ただし、参照を指すのではなく、ベクトル内の要素の値を直接設定できるかどうか疑問に思っていました。言い換えれば、私はこのようなことをしたいと思います
*bv[0] = 42;
*bv[1] = 102.4;
しかし、これはコンパイルされません。これについてのアドバイスはありますか?
ありがとう。
編集:
どうやら、私は自分の質問に答えるのに十分なポイントを持っていないので、代わりに元の質問に私の解決策を入れることにしました。これが、このページに出くわした誰かの助けになることを願っています.
誰かに役立つ場合に備えて、自分の質問に答えると思いました。バリアント内のポインタが参照するものを変更するビジター クラスを作成しました。これがビジター クラスのコードです (もちろん、これはテンプレート化されたクラスにすることができます)。
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]);