これはあなたの質問に対する直接的な回答ではありません。私は の代替品std::vector
や、必要なことを実行できるようにする別の使用方法を提供できないからです。
ただし、 の定義を変更できる場合は、従来の参照の代わりにMyObject
使用するように変更するオプションがあるかもしれません。std::reference_wrapper
これによりMyObject
、割り当て可能になります。
例:
#include <vector>
#include <functional>
#include <iostream>
struct MyObject
{
//int &_i;
std::reference_wrapper<int> _i;
MyObject(int &i):_i(i) {}
};
int main() {
std::vector<MyObject> vec;
int i1 = 3;
int i2 = 4;
MyObject c1(i1);
MyObject c2(i2);
/* Storing object. */
vec.push_back(c1);
/* Assigning to it. */
vec[0] = c2;
/* Confirming that it's the correct object now. */
for (const MyObject &it : vec)
std::cout << it._i << std::endl;
/* Modifying the value of its internal reference. */
vec[0]._i.get() = 5;
/* Confirming that the original int changed value indeed. */
std::cout << "i2 == " << i2 << std::endl;
return 0;
}
警告:既存のコードには、参照メンバー (つまり、_i
上記のコードで呼び出されたメンバー) への直接割り当てが既に含まれている場合があります。これらの割り当ては、参照が参照するオブジェクトの値を変更することを目的としていました。参照を に置き換える場合std::reference_wrapper
、すべての直接代入_i = x
を に置き換える必要があります_i.get() = x
。そうしないと、プログラムのセマンティクスが完全に変わります。
(編集) 使用される参照が const-references のconst T&
場合、 astd::reference_wrapper<const T>
を使用できます。上記の例を使用すると、MyObject
then の定義は次のように変わります。
struct MyObject
{
std::reference_wrapper<const int> _i;
MyObject(const int &i):_i(i) {}
};