【发布时间】:2017-04-25 19:11:30
【问题描述】:
所以,我有一个类的方法及其重载,如下所示:
bool my_for_each(someIterator begin, someIterator end, bool (*_lambda)(someIterator));
void my_for_each(someIterator begin, someIterator end, void (*_lambda)(someIterator));
如您所见,唯一的区别是传递函数的签名,即它的返回类型。 虽然上面的代码在我调用它时工作得很好:
my_for_each(iteratorBegin, iteratorEnd, [](someIterator) {; }); // calls void version
my_for_each(iteratorBegin, iteratorEnd, [](someIterator)->bool {return false; }); // calls bool version
...,如果我将 my_for_each 函数编写如下:
bool my_for_each(someIterator begin, someIterator end, std::function<bool(someIterator)> _lambda);
void my_for_each(someIterator begin, someIterator end, std::function<void(someIterator)> _lambda);
如果我以相同的方式调用函数(C2668 对重载函数的模糊调用),则代码无法编译。虽然,如果我手动转换函数:
my_for_each(iteratorBegin, iteratorEnd, static_cast<std::function<void(someIterator)>>([](someIterator) {; })); //calls void version
my_for_each(iteratorBegin, iteratorEnd, static_cast<std::function<bool(someIterator)>>([](someIterator) -> bool { return false; })); //calls bool version
代码运行良好。所以我只是想知道:
- 为什么普通函数指针类型推导比std模板“强”?
- 是否有某种解决方法可以在不手动转换参数的情况下仍使用更通用的版本?
编译器是VS2015。
谢谢,祝你有美好的一天!
【问题讨论】:
-
@FrançoisAndrieux 已修复,只是一个转录错误
-
my_for_each函数的返回值是什么意思? -
它似乎是两个迭代器形成一个范围,以及一个接受迭代器并对其执行某些操作的函数。我不确定第二个版本中的所有
bools 都在做什么(可能是 and 或 an or 操作)。 -
@FrançoisAndrieux 如果每个 lambda 调用都返回 true,则返回 true,否则返回 false。
标签: c++ overloading type-deduction