在实现文件中使用 header 文件的通用 lambda

Using generic lambda of header file in implementation file

我在 header 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 中为 someMethod 提供一个实现? 这不起作用:

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

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

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

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

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

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

不会工作。 实例化 时,必须完全定义模板(和 lambda)。您不能在 .cpp 中有通用模板定义 - 在 .cpp 中只能实现完全专业化(非正式地说)。有多种方法可以解决这个问题。蛮力方法是为每种类型添加专门化(可能调用仅存在于 .cpp 中的通用模板)。另一种方法可能是使用某种抽象工厂设计(返回基于分派类型的接口)——但这里的信息太少了,这是一个可行的解决方案。