![](/img/trans.png)
[英]how can I make variadic template function with a function pointer as non type argument?
[英]How can i make pointer to a template function?
我有一個模板排序函數,它將指向另一個函數的指針作為參數來定義排序規則。
template<typename T>
void sort(T* arr, int size, function<bool(T, T)>& comparer);
我想用 lambda 表達式調用這個函數
sort(arr, size, [](int num1, int num2) { if (num1 > num2) { return true; } else { return false; } });
但是我有一個錯誤:
錯誤(活動)E0304 沒有重載函數“sort”的實例與參數列表匹配
有沒有辦法創建指向模板函數的指針? 我怎樣才能做到這一點?
模板參數推導將嘗試從第一個參數T* arr
和第三個function<bool(T, T)>& comparer
推導出T
這將失敗,因為 lambda 實際上沒有任何T
類型function<bool(T, T)>
。 (它只能轉換為一個。)
在函數模板中,函數對象通常由模板參數直接獲取,而不是作為std::function
:
template<typename T, typename F>
void sort(T* arr, int size, F comparer);
或者
template<typename T, typename F>
void sort(T* arr, int size, F&& comparer);
取決於您是想要函數對象的副本還是只是一個引用。
std::function
。#include <functional>
template <typename T>
void sort(T* arr, int size, std::function<bool(T, T)> const & comparer)
{
// sort
}
int main()
{
int const size = 10;
int arr[size];
sort(arr, size, std::function{[](int num1, int num2) {
if (num1 > num2) {
return true;
} else {
return false;
}
}});
}
如果您可以更改sort
的簽名,請參閱walnut 的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.