繁体   English   中英

成员模板 function 定义和不完整类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM