それはすでにライブラリ関数として提供していますので、私は本当に、あなたがファンクタとしてstd::get
を使用したいです!
私たちがこの行を書くことができたらうれしいですね!
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
...しかし、それよりも少しひどいです。あなたは、使用するget
明確にする必要があります。
int main() {
std::vector<int> items;
std::vector<std::pair<int, int>> pairs;
pairs.push_back(std::make_pair(1, 3));
pairs.push_back(std::make_pair(5, 7));
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items),
(const int& (*)(const std::pair<int, int>&))std::get<0>);
return 0;
}
問題は、それがペアの任意の並べ替えのために働くように、パラメータとして1 pair&
、2 const pair&
、および3 pair&&
を取るために、std::get
is overloadedです入力として。残念ながら、オーバーロードが私たちの元の行ので
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
利回り
error: no matching function for call to ‘transform(std::vector<std::pair<int, int> >::iterator, std::vector<std::pair<int, int> >::iterator, std::back_insert_iterator<std::vector<int> >, <unresolved overloaded function type>)’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
^
...
/usr/include/c++/4.8/bits/stl_algo.h:4915:5: note: template argument deduction/substitution failed:
note: couldn't deduce template parameter ‘_UnaryOperation’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
それはあなたが推測するときのために求めているstd::get
のどの過負荷を知らない、std::transform
のテンプレート型推論の邪魔になりますテンプレートはstd::transform
のため、手動で指定する必要があります。関数ポインタを正しい型にキャストすると、コンパイラに "ちょっと、get
がconst&
で、const&
を返します。
少なくとも、私たちは標準ライブラリコンポーネントを使用していますか?
そしてラインの数の点で、それは他のオプションよりも悪化しません:kotlinski @ http://ideone.com/6dfzxz
誰もが改善を考えることができますか?このように 'std :: get'をきれいに使うことができるのは素晴らしいことです。 ...本当に私は 'reinterperet_cast&)>(std :: get <0>)'を使用しているはずですが、それはもっと悪いようです... –
NHDaly
私はそれを考えると思います"ハード"キャストを、引数を指定できるラムダの中にラップされたget関数で置き換えることは可能です –