달성하고자하는 것은 세 개의 인수, 반복자 쌍 및 값을 변환하는 함수를받는 makeSet() 함수입니다. std::map<K,V>
std::set<std::pair<V,K>>.
함수 템플리트에서 lambda를 사용하고 유형을 추론 할 수 없습니다. makeSet() 유스 케이스
에 클라이언트 코드 내 현재의 시도가 같다
auto s = makeSet(hash.begin(), hash.end(),
[](std::pair<int,int> x) { return std::make_pair(x.second, x.first); });
처럼 보일 수 있습니다
하나의 유스 케이스는 값의 순서에서 세트를 생성 할 수 있으며, 변환, 예를 들어, 변환합니까 따르십시오,
// (commented code are some other *failed* attempt).
template <typename Iterator,
typename T = typename std::iterator_traits<Iterator>::value_type,
template<typename ... > class Monad, typename R >
// typename R, typename Monad = std::function<R(T)> >
std::set<R> makeSet(Iterator first, Iterator last, Monad<R,T> f) {
std::set<R> res;
for (; first != last; ++first) res.insert(f(*first));
return res;
}
하지만 안타깝게도 작동하지 않습니다. 문제가 R을 추측하지 못하는 것 같습니다.
해결책이나 해결 방법이 있습니까? 나에게 올바른 방법을 말할 수 있다면 매우 감사 할 것입니다.
아, 사랑스럽고 때로는 까다로운 선언! – qeatzy
range는 [it] (https://ericniebler.github.io/std/wg21/D4128.html)과 비슷한 한 쌍의 반복자 대신 range 객체를 사용합니까? 아니면 다른 것이 있습니까? – qeatzy
'decay_t'가 타입을 저장에 적합하게 만들기 때문에'std :: decay_t'을 사용할 것입니다. 두 번째 요점은'std :: function'의 타입을 추론해서는 안된다는 것입니다; 'std :: function'은 타입 소거 클래스이고 타입 공제와 타입 소거는 반대입니다. 지울 형식을 유추하는 것은 디자인 결함의 징조입니다. 여기서 고정 된 유형이 필요하기 때문에 지울 수 있습니다. 정확한 유형을 알고 있기 때문에 추론합니다. 정확한 유형, 999/1000 번을 알고 있다면 고정 유형이 필요하지 않습니다. –
Yakk