1

標準の組み込み型へのポインターを含む、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]);
4

1 に答える 1

0

ポインタが本当に必要な場合、答えはノーです。必要なメモリを割り当てて後で解放する実行可能な方法がないためです。

(ほとんど?)すべての値にメモリを割り当てる必要がある場合boost::variant<int, double>は、行く方法です。

(ほとんど?) すべての値へのポインターを格納し、少数の値にメモリを割り当てる必要がある場合は、(とにかく) より複雑なソリューションが必要です。

于 2012-02-08T18:33:15.420 に答える