전달 된 functor에 따라 템플릿 매개 변수를 제약하고 싶습니다. 일부 컨테이너 유형에서,이 FoldLeft
기능을 고려전달 된 functor에 따른 제약 템플릿 매개 변수
template<typename F, typename R>
R FoldLeft(F&& functor, R initialValue) {
R r = initialValue;
/* assume that this is a range of uint64_t's */
while (first != last) {
r = std::forward<F>(functor)(r, *(first++));
}
return r;
}
이 기능은 다음과 같이 호출 할 수 있습니다 : 여기
auto sum = FoldLeft([](uint64_t i, auto& e) { return e + i; }, 0);
이 문제가
R
가에
0
을있는
initialValue
매개 변수, 추론된다는 것이다 이 경우 따라서
int
이됩니다. 마찬가지로
decltype(sum)
도
int
이됩니다.
람다 또는 다른 호출 가능 유형 일 수있는 functor의 반환 유형으로 R
을 추려 놓고 싶습니다. 이미이 오류로 실행 항상 this answer에서 방법을 사용했지만 :
error: decltype cannot resolve address of overloaded function
struct function_traits
^~~~~~~~~~~~~~~
note: substitution of deduced template arguments resulted in errors seen above
(링크 된 답변에서 복사 fuction_traits
) 내 시도의 코드 :
template<typename T>
using LamRet = typename function_traits<T>::result_type;
template<typename F>
LamRet<F> FoldLeft(F&& functor, LamRet<F> initialValue) {
LamRet<F> r = initialValue;
/* assume that this is a range of uint64_t's */
while (first != last) {
r = std::forward<F>(functor)(r, *(first++));
}
return r;
}
'첫 번째/마지막'에서이 정보를 얻는 것이 훨씬 더 쉽습니다. 제안하는 것보다 쉽습니다. – Justin
람다에서 매개 변수로'auto'를 사용하지 않는 것이 좋다면, 코드는 작동 할 것입니다. – Justin