이미 라이브러리 함수로 제공 있기 때문에 정말, 당신은 펑터로 std::get
를 사용하려면!
이 줄을 쓸 수 있다면 좋지 않을까요?
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
...하지만 그보다 약간 끔찍합니다. 이 쌍 어떤 종류를 위해 작동 할 수 있도록 std::get
is overloaded는, 매개 변수 등 2 const pair&
및 3 pair&&
1. pair&
을 취할 수있는 문제가
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;
}
을 : 당신은 사용할 get
을 명확하게 할 필요가 입력으로.불행하게도, 오버로드 오리지널 라인 그래서
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 함수로 대체 할 수 있습니다 –