當涉及std:function或lambda函數時,C+11不推斷類型當我定義這個函數時,template<class A>set<A> test(const set<A>& input) {
return input;}我可以用test(mySet)在代碼的其他地方,無需顯式定義模板類型。但是,當我使用以下函數時:template<class A>set<A> filter(const set<A>& input,function<bool(A)> compare) {
set<A> ret;
for(auto it = input.begin(); it != input.end(); it++) {
if(compare(*it)) {
ret.insert(*it);
}
}
return ret;}當我調用此函數時,使用filter(mySet,[](int i) { return i%2==0; });我得到以下錯誤:錯誤:沒有調用‘filter’的匹配函數(std:set&,main():)然而,所有這些版本做工作:std::function<bool(int)> func = [](int i) { return i%2 ==0; };set<int> myNewSet = filter(mySet,func);
set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
set<int> myNewSet = filter(mySet,function<bool(int)>([](int i){return i%2==0;}));當我將lambda函數直接放入表達式而不直接創建std::function?編輯:根據注釋中Luc Danton的建議,這里有一個替代函數,它不需要顯式傳遞模板。template<class A,class CompareFunction>set<A> filter(const set<A>& input,CompareFunction compare) {
set<A> ret;
for(auto it = input.begin(); it != input.end(); it++) {
if(compare(*it)) {
ret.insert(*it);
}
}
return ret;}這可以被set<int> result = filter(myIntSet,[](int i) { i % 2 == 0; });而不需要模板。編譯器甚至可以在某種程度上猜測返回類型,使用新的Dectype關鍵字和使用新函數返回類型語法。下面是一個示例,它使用一個過濾函數和一個基于值生成鍵的函數將集合轉換為映射:template<class Value,class CompareType,class IndexType>auto filter(const set<Value>& input,CompareType compare,IndexType index) ->
map<decltype(index(*(input.begin()))),Value> {
map<decltype(index(*(input.begin()))),Value> ret;
for(auto it = input.begin(); it != input.end(); it++) {
if(compare(*it)) {
ret[index(*it)] = *it;
}
}
return ret;}也可以在不直接使用模板的情況下調用它,如map<string,int> s = filter(myIntSet,[](int i) { return i%2==0; },[](int i) { return toString(i); });
3 回答

慕姐8265434
TA貢獻1813條經驗 獲得超2個贊
template<typename T> struct X { X(T data) {} }; template<typename T> void f(X<T> x) {}
f
f(10);
T
int
和int
template<typename T> struct X { X(T data) {} X(int data) {} //another constructor };
T
f(10)
T
template<typename T> struct X<T*> //specialized for pointers { X(int data) {}; };
T
f(10)
std::function
std::function
std::function
).

蕪湖不蕪
TA貢獻1796條經驗 獲得超7個贊
template <typename R, typename T>int myfunc(std::function<R(T)> lambda){ return lambda(2);}int r = myfunc([](int i) { return i + 1; });
template <typename Func, typename Arg1>static auto getFuncType(Func* func = nullptr, Arg1* arg1 = nullptr) -> decltype((*func)(*arg1)); template <typename Func>int myfunc(Func lambda){ return myfunc<int, decltype(getFuncType<Func, int>())>(lambda);}
template <typename Func, typename Arg1>static auto getFuncType(Func* func = nullptr, Arg1* arg1 = nullptr) -> decltype((*func)(*arg1)) {};
template <typename Func>int myfunc(Func lambda){ return myfunc<int, decltype(getFuncType<Func, int>())>(lambda);}
template <typename R, typename T>int myfunc(std::function<R(T)> lambda){ return lambda(2);}template <typename Func, typename Arg1>static auto getFuncType(Func* func = nullptr, Arg1* arg1 = nullptr) -> decltype((*func)(*arg1)) {};template <typename Func>int myfunc(Func lambda){ return myfunc<int, decltype(getFuncType<Func, int>())>(lambda);}int r = myfunc([](int i) { return i + 1; });
template <typename Func, typename Arg1, typename Arg2>static auto getFuncType(Func* func = nullptr, Arg1* arg1 = nullptr, Arg2* arg2 = nullptr) -> decltype((*func)(*arg1, *arg2)) {};
- 3 回答
- 0 關注
- 602 瀏覽
添加回答
舉報
0/150
提交
取消