【发布时间】:2020-02-14 11:25:50
【问题描述】:
我在标题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...
}
由于不允许部分特化(仅对函数模板进行完全特化),有没有其他方法可以将头文件的 lambda “传递”到实现文件MyType.cpp?
如果无法传递,也许有一种方法可以将这个 lambda 动态存储在 MyType.hpp 中并在 MyType.cpp 中访问它?
【问题讨论】:
-
模板必须在标头中定义(非正式地说)。
-
即使在single source 中也无法编译。请提供 minimal reproducible example 头文件中的所有内容,然后询问如何将内容移动到 cpp。
-
@MarekR:你错误地喂了洞Demo(缺少
const)。 -
@Jarod42 是的,你说得对,但是有 more then one way to fix it 并且 OP 应该首先定义他到底需要什么。
-
是的,一般来说模板应该在headers中定义,但在极端情况下有一些技巧,模板可以限制为特定类型,一些模板方法可以移动到cpp。
标签: c++ templates lambda template-specialization generic-lambda