[英]Member template function definition and incomplete types
我正在尝试实现以下目标,但我不确定这是否可行,如果可以,如何实现:我有一个 header,我在其中声明了一个 class,它有一个模板成员 ZC1C425268E68385D1AB5074C17A94 的引用,它返回一个不完整的类型。 为了让它更具体一点,假设它处理事件,它的声明如下:
struct EventConnection;
class EventHandler {
public:
template<typename Func>
const EventConnection& connectToEvent(EventType t, Func f);
void disconnect(const EventConnection& connection);
};
在这种情况下, EventConnection
只是我希望客户端代码在稍后disconnect
的一些内部结构,我想在此处将其保留为不完整的类型。
我知道从理论上讲,模板的定义应该在 header 中的 go 中,或者可以在 a.cpp 文件中提供,只要一个明确地使用将使用的类型实例化模板即可。 但在这种情况下,我不能列出这些,因为它非常随意,因此我认为我被卡住了,因为如果我真的希望EventConnection
只在 header 中前向声明,那么我不能在header,但由于我无法在 .cpp 文件中列出模板实例化,因此我无法在同一个文件中提供模板定义(我可以在其中包含/定义我的不完整类型并在模板正文中使用它)。
我是否在评估这项权利并且应该重新考虑这一点? 或者有没有办法在 header 中转发声明一个类型,并以某种方式在源文件的模板主体中使用完整类型?
模板定义确实必须在实例化时可见。
显式实例化可以避免隐式实例化。
由于您不能使用显式实例化,并且不想向用户提供定义,因此您可以使用类型擦除类型而不是模板。
从名称来看, std::function
似乎是一个不错的候选者:
const EventConnection& connectToEvent(EventType, std::function<void (EventType/*, ...*/)>);
或接口:
const EventConnection& connectToEvent(EventType, IEventVisitor&);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.