当涉及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 关注
- 546 浏览
添加回答
举报
0/150
提交
取消