C++候选模板 将 lambda 作为 std::function 的参数传递时忽略错误
C++ Candidate Template Ignored error when passing lambda as argument for std::function
这是我在C++遇到的模板问题的一般骨架版本。 我不太清楚如何让bar
函数模板在从foo
调用时被识别为合理的候选者。
#include <iostream>
#include <cstdlib>
#include <unordered_map>
template<class T>
std::unordered_map<std::string, T> getStr2TMap() {
return {}; // suppose logic here is a bit more involved
}
template<class T>
std::unordered_map<int, T> getInt2TMap() {
return {}; // suppose logic here is a bit more involved
}
template<class U, class T>
void bar(
const std::function<void (std::unordered_map<U, T>&&)>& baz
) {
if (rand() % 2 > 0) {
baz(getInt2TMap<T>());
} else {
baz(getStr2TMap<T>());
}
}
template<class T>
void foo(
const std::unordered_map<std::string, T>& map1
) {
bar([&map1](auto&& map2) {
// do some things with map1 and map2
});
}
int main() {
std::unordered_map<std::string, int> myMap;
foo<int>(myMap);
}
编辑
代码的简化版本,相同的错误。 我正在寻找上述版本的解决方案,而不是这个版本。
#include <iostream>
#include <functional>
#include <unordered_map>
template<class T>
void foo(
const std::function<void (std::unordered_map<int, T>&&)>& bar
) {
std::unordered_map<int, T> myMap;
bar(myMap);
}
int main() {
foo([](auto&& m) {
});
}
显示的代码尝试推断以下类型的T
和U
std::function<void (std::unordered_map<U, T>&&)>
推导尝试针对传递给模板函数的 lambda 参数:
[&map1](auto&& map2) {}
问题是 lambda 不是某种std::function
。它是一个:
。唯一未命名非联合非聚合类的临时对象 类型,称为"闭包"类型,...
(引用)
换句话说,lambda 对象是一个类的实例,该类具有执行 lambda 代码的operator()
(捕获的对象被转换为未命名类的成员)。因此,由于它不是std::function
,所以不可能从中推断出std::function
的类型。
由于它是一个可调用的类型,它可以转换为std::function
,但是:
bar(static_cast<std::function<void(std::unordered_map<std::string, T> &&)>>
([&map1](auto&& map2) {
// do some things with map1 and map2
}));
}
这将使bar()
模板函数得到识别。
但是显示的代码仍然存在第二个问题:
if (rand() % 2 > 0) {
baz(getInt2TMap<T>());
} else {
baz(getStr2TMap<T>());
}
根据掷骰子的时间,代码将尝试将字符串的无序映射或整数的无序列图传递给baz()
。
那是。。。不去工作。在游戏的这个阶段,baz
是某种std::function
。它不是模板。因此,它只能采用一种类型的参数。
如果添加该static_cast
,并bar()
设为:
baz(getStr2TMap<T>());
为了匹配调用方传递字符串的无序列图的事实,应编译生成的代码。
bar()
内部发生的事情是一个单独的问题。使用static_cast
回答了如何bar
识别候选模板的问题。
Sam 很好地观察了U
在bar
中的不一致之处。但是在你的简单例子中,为什么要经历const std::function<void (std::unordered_map<int, T>&&)>&
的所有麻烦,当你可以写:
#include <iostream>
#include <functional>
#include <unordered_map>
template<class T, class Func>
void foo(
Func bar
) {
std::unordered_map<int, T> myMap;
bar(myMap);
}
int main() {
// needs the hint for T, since it isn't used anywhere
foo<int>([](auto&& m) {
});
}
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用指向成员的指针将成员函数作为参数传递
- 如何将参数传递给正在使用模板的类
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将部分流作为参数传递
- 我正在开发服务器,ip作为参数传递不起作用
- 将成员函数指针作为参数传递给模板方法
- 如何在C++中将迭代器作为函数参数传递
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 将另一个类的成员函数传递到 std::function 参数中
- 将成员函数作为参数传递给其他成员函数 (C++ 11 <function>)
- 从作为模板函数参数传递的 std::function 推导返回和参数类型
- 将 std::function 作为参数传递,const void *
- 当类型和参数长度可能不同时,如何将'function with parameters'作为参数传递?
- C++候选模板 将 lambda 作为 std::function 的参数传递时忽略错误
- "unresolved overloaded function type"错误并将运算符作为函数参数传递
- 如何将本地<Function>作为参数传递?
- 在将 lambda 作为参数传递时,我是否应该避免转换为 std::function
- 将std::function作为参数传递时出现问题