나는 나를 위해 잘 작동하는 기능했습니다 :설정 일반 반환 형식
template <typename __container, typename __callback = std::function <
void (typename __container::value_type, typename __container::value_type)>
>
auto reduce(__container &&container, __callback &&callback) ->
decltype(__container::value_type);
그러나 나는 점점 오전 :
template <typename __container, typename __callback = std::function <
void (typename __container::value_type, typename __container::value_type)>
>
int reduce(__container &&container, __callback &&callback)
{
auto current = container.begin();
for (auto value : container)
*current = callback(*current, value);
return *current;
};
int result = functional::reduce(vector, [](const int current, const int next) -> int {
return current + next;
});
std::cout << result; // 10
그리고 지금, 나는 하나를 통합하는거야 다음 오류 :
reduce.cpp:61:9: error: no matching function for call to 'reduce'
int i = reduce(vector, [](const int current, const int next) -> int {
^~~~~~~~~~~~~~~~~~
reduce.hpp:69:7: note: candidate template ignored: substitution failure [with __container = std::__1::list<int, std::__1::allocator<int>> &, __callback = <lambda at
nott.cpp:61:36>]
auto reduce(__container &&container, __callback &&callback) -> decltype(__container::value_type)
^
1 error generated.
make: *** [build] Error 1
어떻게 일반 반환 유형을 설정할 수 있습니까?
UPDATE :
template <typename __container, typename __callback>
auto reducef(const __container& input, __callback callback) ->
decltype(callback(std::declval<typename __container::value_type>(), std::declval<typename __container::value_type>()))
{
decltype(
callback(
std::declval<typename __container::value_type>(),
std::declval<typename __container::value_type>()
)
) result{};
return std::accumulate(input.begin(), input.end(), result, callback);
};
는'value_type' 당신은'decltype'를 사용할 필요가 없습니다, 이미 유형 : 여기에, (스타일 손에 문제가 아니므로) 당신이 무엇을했다에 가까운 코드를 유지하는 것은 작업 버전입니다 그것으로. 당신은'typename' 생각이 필요합니다. –
두 개의 밑줄 (예 :'__container')로 시작하는 이름은 구현을 위해 예약되어 있으므로 사용하지 마십시오. – ipc
이 코드의 수정이 끝나면 다용도가 아닌'std :: accumulate' 버전으로 끝날 것입니다. –