0

我在标题中有这种类型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

4

2 回答 2

1

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

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

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

于 2020-02-14T11:57:19.910 回答
1
template<typename L>
void MyType::someMethod(L lambda)
{
    lambda(42);
    lambda("42");
    // etc...
}

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

于 2020-02-14T11:57:31.547 回答