C++ 成员模板函数定义和不完整类型
我试图实现以下目标,但我不确定这是否可能,如果可能,如何实现:我有一个标头,其中声明了一个类,该类有一个模板成员函数,该函数返回对不完整类型的引用。为了让它更具体一点,假设它处理事件,声明如下:C++ 成员模板函数定义和不完整类型,c++,templates,incomplete-type,C++,Templates,Incomplete Type,我试图实现以下目标,但我不确定这是否可能,如果可能,如何实现:我有一个标头,其中声明了一个类,该类有一个模板成员函数,该函数返回对不完整类型的引用。为了让它更具体一点,假设它处理事件,声明如下: struct EventConnection; class EventHandler { public: template<typename Func> const EventConnection& connectToEvent(EventType t, Func
struct EventConnection;
class EventHandler {
public:
template<typename Func>
const EventConnection& connectToEvent(EventType t, Func f);
void disconnect(const EventConnection& connection);
};
struct-EventConnection;
类事件处理程序{
公众:
模板
const EventConnection&connectToEvent(事件类型t,函数f);
无效断开连接(常量事件连接和连接);
};
在本例中,EventConnection
只是一些内部代码,我希望客户机代码在稍后的时候提供给disconnect
,我希望在这里将其作为一个不完整的类型保留
我知道,理论上,模板的定义应该放在头文件中,或者可以在.cpp文件中提供,只要用将要使用的类型显式地实例化模板。但是在这种情况下,我不能列出这些,因为这是非常随意的,因此我认为我被卡住了,因为如果我真的希望EventConnection
只在头中被前向声明,那么我不能在头中提供模板定义,但因为我不能在.cpp文件中列出模板实例化,然后我不能在同一个文件中提供模板定义(我可以在该文件中包括/定义我的不完整类型,并在模板体中使用它)
我的评估是否正确,是否应该重新思考?或者,是否有一种方法可以在头文件中向前声明一个类型,并以某种方式在源文件的模板体中使用完整的类型?模板定义确实必须在实例化时可见 显式实例化可以避免隐式实例化 由于不能使用显式实例化,并且不想向用户提供定义,所以可以使用类型擦除类型而不是模板 从名称来看,
std::function
似乎是一个很好的候选者:
const EventConnection& connectToEvent(EventType, std::function<void (EventType/*, ...*/)>);
很久以前引入了
export
关键字,但正如cppreference所说,export的实现非常罕见,并且在细节上彼此不一致。通常使用pe erase来实现这一点:您定义一个接口,并专门为头中定义的函数模板中的Func
类型实现它。然后,将该接口传递给一个不透明函数,该函数处理EventConnection
内部。这或多或少就是std::function
的实现方式,它可能会直接解决您的问题:)@dyp谢谢,我会研究一下的!
const EventConnection& connectToEvent(EventType, IEventVisitor&);