在实现文件中使用 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 中的通用模板)。另一种方法可能是使用某种抽象工厂设计(返回基于分派类型的接口)——但这里的信息太少了,这是一个可行的解决方案。
我在 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 中的通用模板)。另一种方法可能是使用某种抽象工厂设计(返回基于分派类型的接口)——但这里的信息太少了,这是一个可行的解决方案。