C++11如何使用lambda函数模板做参数
PHP中文网
PHP中文网 2017-04-17 15:21:10
0
2
813

开始使用C++11特性,碰到一些问题。以下写了一个快速排序的函数模板,划分操作的比较函数使用一个std::function<int(T,T)>的参数接收,而在main中使用函数模板接收一个lambda函数[](int a, int b) -> int {return a < b;}时报错,函数不匹配。这里该如何处理?

#include <iostream>
#include <functional>

template <typename T>
void Swap(T *a, T *b) {
    T tmp = *a;
    *a = *b;
    *b = tmp;
}

template <typename T>
int partition(T array[], int low, int high, const std::function<int(T, T)> &cmp) {
    int i = low - 1;
    T x = array[high];
    for (int j = low; j < high; j++) {
        if (cmp(array[j], x)) {
            i++;
            Swap(&array[j], &array[i]);
        }
    }
    Swap(&array[i + 1], &array[high]);
    return i + 1;
}

template <typename T>
void quicksort(T array[], int low, int high, const std::function<int(T, T)> &cmp) {
    if (low < high) {
        int mid = partition(array, low, high, cmp);
        quicksort(array, low, mid - 1, cmp);
        quicksort(array, mid + 1, high, cmp);
    }
}

int main() {
    std::cout << "Hello, World!" << std::endl;
    int arr[] {5, 3, 9, 1, 6, 2};
    quicksort(arr, 0, 5, [](int a, int b) -> int {
       return a < b;
    });
    for(auto item: arr) {
        std::cout << item << "  ";
    }
    std::cout << std::endl;
    return 0;
}
报错信息:
E:\Project\DesignPattern\main.cpp: In function 'int main()':
E:\Project\DesignPattern\main.cpp:39:6: error: no matching function for call to 'quicksort(int [6], int, int, main()::<lambda(int, int)>)'
     });
      ^
E:\Project\DesignPattern\main.cpp:26:6: note: candidate: template<class T> void quicksort(T*, int, int, const std::function<int(T, T)>&)
 void quicksort(T array[], int low, int high, const std::function<int(T, T)> &cmp) {
      ^
E:\Project\DesignPattern\main.cpp:26:6: note:   template argument deduction/substitution failed:
E:\Project\DesignPattern\main.cpp:39:6: note:   'main()::<lambda(int, int)>' is not derived from 'const std::function<int(T, T)>'
     });
      ^
PHP中文网
PHP中文网

认证高级PHP讲师

모든 응답(2)
迷茫

lambda가 const std::function<int(T, T)>&로 변환되기 전에는 T 유형을 추론할 수 없습니다.

보조 클래스를 추가하여 std::function의 유형을 먼저 결정한 다음 람다의 암시적 변환을 수행할 수 있습니다.

으아악
小葫芦

유형 파생 중에는 사용자 정의 유형 변환이 수행되지 않습니다. 즉, 람다 표현식에서 std::function으로의 변환이 수행되지 않습니다. 그러니 여기서 무릎을 꿇으세요.

여기서 필요한 것은 BinaryPredicate입니다. Fn &&fn을 직접 작성하세요. 그런 다음 Fn에 대해 BinaryPredicate 검사를 수행합니다.

또는

과 같이 T를 비공제 컨텍스트로 전환합니다. 으아악

또는

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿