【发布时间】:2020-03-16 18:07:16
【问题描述】:
我希望能够有一些仿函数作为函数的参数。
仿函数的参数应该是模板化的,所以我可以调用其他依赖于它的类型的函数。
这是我目前所拥有的:
using namespace std;
template<typename T, typename PredT>
void foo(PredT pred)
{
for(size_t i=0; i< 3; i++)
{
std::function<void(T)> predImpl(pred);
T t{};
predImpl(t);
}
}
template<typename T>
void foo2(std::function<void(T)> func)
{
for(size_t i=0; i< 3; i++)
{
T t{}; //there's obviously other logic that produces those;
func(t);
}
}
int main()
{
//foo([](int x) {cout << x << '\n';}); //error: no matching function for call to 'foo(main()::<lambda(int)>)
// foo([](int x) {cout << x << '\n';}); doesn't work error: no matching function for call to 'foo(main()::<lambda(int)>)'
foo2(std::function<void(int)>([](int x) {cout << x << '\n';})); // syntax is ugly, requires an explicit conversion to std::function
}
我基本上想根据 lambda 的参数推断出 T,但我不知道这是否可能。
使用显式 std::function 转换的解决方案可行,但它很麻烦,并且有点失去了仅使用 lambda 的便利性。
【问题讨论】:
-
问题是参数推导。模板不能根据这个模板定义和用法推导出
T。这里是simple fix。现在的问题是可以从PredT中推断出T吗?我不这么认为。 -
是的,我想避免提及具体类型,但听起来无法推断,您是否碰巧知道哪个规则不符合该场景?