函数模板可用于本地lambda,但不能用于其他函数
Function template works with local lambdas, but not with other functions
所以我写了一个函数,它"顺序地"组成void Lambda,这样我就可以在算法中同时使用它们:
template <typename F, typename... Fs>
auto lambdaList(F f, Fs... fs)
{
return [=] (auto&... args) { f(args...); lambdaList(fs...)(args...); };
}
template <typename F>
auto lambdaList(F f)
{
return [=] (auto&... args) { f(args...); };
}
如果我使用本地lambdas,它会起作用,但当我使用不同名称空间中的函数时就不行了:
#include <iostream>
namespace foo {
void a() { std::cout << "an"; }
void b() { std::cout << "bn"; }
}
template <typename F, typename... Fs>
auto lambdaList(F f, Fs... fs)
{
return [=] (auto&... args) { f(args...); lambdaList(fs...)(args...); };
}
template <typename F>
auto lambdaList(F f)
{
return [=] (auto&... args) { f(args...); };
}
int main() {
auto printStarBefore = [] (const std::string& str) {
std::cout << "* " + str;
};
auto printStarAfter = [] (const std::string& str) {
std::cout << str + " *" << std::endl;
};
lambdaList(printStarBefore, printStarAfter)("hi"); // ok
lambdaList(foo::a, foo::b)(); // error
}
错误为no matching function for call to 'lambdaList()'
,带有:
main.cpp:11:56: note: candidate expects at least 1 argument, 0 provided
return [=] (auto&... args) { f(args...); lambdaList(fs...)(args...); };
~~~~~~~~~~^~~~~~~
为什么它有时有效,有时无效?
您需要反转您的函数:
template <typename F>
auto lambdaList(F f)
{
return [=] (auto&... args) { f(args...); };
}
template <typename F, typename... Fs>
auto lambdaList(F f, Fs... fs)
{
return [=] (auto&... args) { f(args...); lambdaList(fs...)(args...); };
}
按原样,在递归情况下,您的基本情况不会通过非限定查找找到——它只能通过依赖于参数的查找找到。如果参数与lambdaList
不在同一个命名空间中,则根本找不到它,递归步骤将始终调用自己。这就是你错误的根源。
新的排序允许通过正常的非限定查找来找到基本情况lambdaList()
——现在它在递归lambdaList()
的定义点上是可见的。
也就是说,我们可以做得更好。编写一个调用所有内容的函数:
template <typename... Fs>
auto lambdaList(Fs... fs) {
using swallow = int [];
return [=](auto const&... args) {
(void)swallow{0,
(void(fs(args...)), 0)...
};
};
}
现在我们不需要担心任何类型的查找。如果你可以使用一个足够现代的编译器来支持一些C++1z功能,那么使用可以大大减少上述功能
template <typename... Fs>
auto lambdaList(Fs... fs) {
return [=](auto const&... args) {
(fs(args...), ...);
};
}
这完全可以理解!
相关文章:
- 是否可以将函数导入命名空间,但不能导出它?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- std::chrono::d uration 可以按秒初始化,但不能按毫秒初始化?
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 为什么我可以从C++文件中读取 int 值,但不能浮点?
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- SqLite c++,可以创建数据库,但不能将 anthing 插入到表中
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- C++:返回本地对象,但不能正常工作
- 声明适用于 auto,但不能显式声明类型?
- 函数模板可用于本地lambda,但不能用于其他函数
- random_shuffle() 适用于 Windows,但不能在 Linux 上编译
- 自定义分配器可用于vector,但不能用于deque(封装在队列中)
- 用于url编码的c++代码,但不能使用curl
- C++代码段可以用于MSVC,但不能用于g++
- GLSL VertexShader可用于Qt,但不能用于普通OpenGL(SL)
- Map迭代器可用于begin(),但不能用于rbegin()