首页 > 解决方案 > 在实现文件中使用头文件的通用 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.cppfor中提供一个实现someMethod?这不起作用:

template<typename L>
void MyType::someMethod(L lambda)
{
    lambda(42);
    lambda("42");
    // etc...
}

由于不允许部分特化(仅对函数模板进行完全特化),有没有其他方法可以将头文件的 lambda “传递”到实现文件MyType.cpp?如果无法通过,是否存在一种动态存储此 lambdaMyType.hpp并在其中访问它的方法MyType.cpp

标签: c++templateslambdatemplate-specializationgeneric-lambda

解决方案


每个 lambda 都有自己的类型。无论如何,您将无法在源代码中写下类型。

由于具有模板定义的翻译单元永远不会看到 lambda 类型,因此模板永远不会被实例化。而且您将无法获得 lambda 的类型以使其专业化,也无法将其用于手动实例化。

答案是:如果模板仅在其自己的翻译单元中可见,则不能将 lambda 闭包用作专用模板或手动实例化的模板的参数。


推荐阅读