2012-02-08 13 views
1

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

ここでポインタを使用するのはなぜですか? –

+0

さて、boost :: variantをより大きなプログラムに統合しようとしていますが、残念ながら、現時点で唯一現実的な選択肢です。 – endbegin

+3

@endbegin:それは私には意味がありません。なぜ 'std :: vector >'それは非現実的なのでしょうか? – kennytm

答えて

0

あなたが本当にポインタが必要な場合は、答えはノーである 、あなたがすることはできません、 - ほとんどの場合 - 必要なメモリを割り当てて後で解放する方法はありません。

の値をメモリに割り当てる必要がある場合は、boost::variant<int, double>は です。

のすべての値にポインタを格納し、それらの少数のメモリを割り当てる必要がある場合は、より複雑な解決策(とにかく)が必要です。

+0

私は、バリアント内のポインタが指している値を設定する方法が必要だと思います。例えば、variantのint *は整数を含む場所を指しており、その場所を指し示すプログラムの他の部分があります。したがって、その変形例では、その場所の内容を変更することができれば、大丈夫です。 – endbegin

+0

その値にどのような部分のメモリが割り当てられますか? どこで - ヒープ、スタック、静的なデータですか? 後でコードのどの部分が解放されますか? スペースを割り当てるために 'boost :: variant 'が必要な場合は、値を設定してアドレスを取得して、プログラムの他の部分に必要なポインタを取得することができます。 – Zrin

+0

ところで、double型にintを格納しない特定の理由があります.8バイトのdoubleは、少なくとも10^15の大きさまでintを完全に格納できます(私は52ビットと考える)。 – Zrin

関連する問題