模板类是否可以相互依赖,前提是它们不尝试存储彼此的实例?
Can template classes depend on each other provided that they do not try to store instances of each other?
我正在尝试一些简单的基于模板的设计工作,并偶然发现了模板相互依赖性。现在我知道我可以使用虚拟函数和(在这种特定的人工情况下)通过将 EventHandler 方法转换为模板而不是整个类来解决此问题。但是,有没有办法拥有两个相互依赖的模板,前提是它们只使用指向彼此的指针?
这是简化的示例:
typename MySocket;
template<typename SocketClass> struct EventHandler {
void receiveCallback(SocketClass *s) {
}
};
template <typename HandlerType> class Socket {
HandlerType *handler;
};
typedef EventHandler<MySocket> MyHandler ;
typedef Socket<MyHandler> MySocket ;
MyHandler h;
MySocket socket;
int main() {
return 0;
}
对于此代码,编译器给出一个错误,指出套接字已重新定义。有什么想法吗?C++11/14对我来说很好。
鉴于您使用的语法,您要做的事情是不可能的。
也就是说,在将适当的参数传递给模板之前,MySocket
作为类型不存在。
由于MySocket
依赖于MyHandler
,而又取决于你有一个循环依赖MySocket
,所以这是行不通的。
我怀疑您随后试图通过将MySocket
作为类型名来向前声明来解决此问题,这C++无效。
不过,有一种方法可以解决此问题,那就是使用模板模板参数。
模板模板参数允许您将另一个模板作为参数传递给模板
template<template<typename> class SocketT>
struct EventHandlerT;
这里SocketT
是一个模板本身,采用 1 个模板参数(因此名称模板模板参数)
在EventHandlerT
中,您可以定义一个具体类型Socket
,它使用EventHandlerT
作为SocketT
所需的模板参数。
template<template<typename> class SocketT>
struct EventHandlerT;
{
using Socket = SocketT<EventHandlerT>; // Socket is now a concrete type
};
当您想要创建Socket
的实例时,您可以使用内部定义的实例EventHandlerT
using EventHandler = EventHandlerT<SocketT>;
using Socket = EventHandler::Socket;
下面是一个工作示例:
template<template<typename> class SocketT>
struct EventHandlerT
{
using Socket = SocketT<EventHandlerT>;
void receiveCallback(Socket* s)
{
}
};
template <typename HandlerT>
struct SocketT
{
HandlerT* handler;
};
int main()
{
using EventHandler = EventHandlerT<SocketT>;
using Socket = EventHandler::Socket;
EventHandler handler;
Socket socket;
socket.handler = &handler;
handler.receiveCallback(&socket);
return 0;
}
相关文章:
- 在std::vector上存储带有模板的类实例
- 有没有办法在类实例中存储编译时常量?
- 在向量中存储实例
- 模板类是否可以相互依赖,前提是它们不尝试存储彼此的实例?
- 如何通过循环访问数组来读取和存储实例的值?
- 如何将指针存储在实例变量中,该指针被声明为指向基类的指针
- 将CV :: MAT实例存储在C 中的堆上
- 超级级别的方法称为super具有sub的str attr 实例在循环 实例中创建的方法是作为super的指针存储在向
- 如何创建一个将队列作为数据成员的类,该成员在 c++ 中存储另一个类的实例
- 我们是否应该将指向类实例的智能指针存储在大型 std::vector 中以获得更好的性能?
- 可以存储参数化类的所有有效实例吗?
- 基类的C++数组,该数组的元素中存储有派生类的实例
- 当类名存储在另一个变量中时,如何创建类的实例
- 将类实例存储在文件中
- 将所有类实例的列表存储为类中的静态数组
- 如何从字符串中存储的类型创建实例
- 实现存储类以存储某个类的多个实例
- 将 Objective-C 类实例存储在C++类中
- 使用重复将灵气存储到 std::vector 中会导致模棱两可的类模板实例化
- 如何在类构造函数中存储实例引用