大きな がありますstd::vector<int> a
が、そのサブセットのみで作業したいと考えています。アイデアはstd::vector<reference_wrapper<int> > refa
、上記のサブセットのみを含む を作成することでした (mwe では、すべての要素 1< a
< 4)。次に、またはを引数としてrefa
期待する関数に渡したいと思います (これらを とともに使用したいため)。かなり大きくなる可能性があるため、選択を複数回行うことは避けたいと思います。std::vector<int>
std::vector<int>&
a
a
質問
refa
関数に適切に渡すにはどうすればよいですか? 私が欲しいのはbar(refa)
、foobar(refa)
働くことです。
関数を (あまり) 変更せずに、問題を解決するより良い方法はありますか?
コード
#include <functional>
#include <iostream>
#include <vector>
int foo(int &a)
{
a++;
return 0;
}
int bar(std::vector<int> &va)
{
for(auto &vaa : va)
vaa++;
return 0;
}
int foobar(std::vector<int> va)
{
for(auto &vaa : va)
vaa++;
return 0;
}
int main()
{
std::vector<int> a= {1, 2, 3, 4, 5};
std::vector<std::reference_wrapper<int> > refa;
//Fill refa
for(auto &aa : a)
{
if(aa>1 && aa<4) refa.push_back(std::ref(aa));
}
//works
// for(auto &aa : refa)
// aa++;
//works
// bar(a);
//works, a unchanged
// foobar(a);
//works
// for(auto &aa : refa)
// foo(aa);
//works
// for(int &aa : refa)
// foo(aa)
// does not work
// conversion from vector<reference_wrapper<int> > to vector<int>& or vector<int> required
bar(refa);
// foobar(refa);
for(auto &aa : a)
std::cout << aa << std::endl;
return 0;
}
注記
int
は、例を単純にするためにここでのみ使用されています。