c++ - 在实现文件中使用头文件的通用 lambda
问题描述
我在标题中有这种类型MyType.hpp
:
struct MyType
{
template<typename T>
void operator(T t)
{
auto lamdba = [t](auto i){ t.someCall(i); };
someMethod(lamdba);
}
template<typename L>
void someMethod(L);
};
因此,someMethod
使用接受泛型参数的泛型 lambda 调用。是否有可能在MyType.cpp
for中提供一个实现someMethod
?这不起作用:
template<typename L>
void MyType::someMethod(L lambda)
{
lambda(42);
lambda("42");
// etc...
}
由于不允许部分特化(仅对函数模板进行完全特化),有没有其他方法可以将头文件的 lambda “传递”到实现文件MyType.cpp
?如果无法通过,是否存在一种动态存储此 lambdaMyType.hpp
并在其中访问它的方法MyType.cpp
?
解决方案
每个 lambda 都有自己的类型。无论如何,您将无法在源代码中写下类型。
由于具有模板定义的翻译单元永远不会看到 lambda 类型,因此模板永远不会被实例化。而且您将无法获得 lambda 的类型以使其专业化,也无法将其用于手动实例化。
答案是:如果模板仅在其自己的翻译单元中可见,则不能将 lambda 闭包用作专用模板或手动实例化的模板的参数。
推荐阅读
- sql - 带年、月、日的两个日期之间的天数差异
- c - pub-sub 方案中的异常处理 (ZeroMQ)
- c - 使用Arduino产生金码调制的正弦波
- python - 为什么是 (-3//2 = -2)
- gcc - gcc 对 Amazon Linux 的 openmp 支持?
- event-listener - 如何在 Marko 中将事件侦听器作为动态属性传递?
- javascript - 净::ERR_CONNECTION_RESET 200
- python - Visual Studio 代码 - 执行代码失败:错误:调试单元需要 Pip 模块 ptvsd。您需要安装它来调试单元
- javascript - 如何设置构造函数的原型?
- c++ - 为什么这段代码不利于计算功率(效率较低)?