泛型类型,其中类型变量必须具有特定的类型
C++ - generic type where type variable must have specific type
假设我有一个Server
类,带有模板参数。我需要确保参数是另一个Client
类的子类。在c++中可能吗?
例如,给定如下内容:
template <typename CLIENT>
class Server {
void addClient(CLIENT client);
};
我期待这样的东西:
template <typename CLIENT : Client>
class Server {
void addClient(CLIENT client);
}
我想有LoginServer
和GameServer
,两者都基于Server
类,但每个将与不同的Client
子类一起工作。
class LoginServer : public Server<LoginClient>
class GameServer : public Server<GameClient>
我不想在LoginServer内重新键入所有Client
类型到LoginClient
,否则编译器会抛出错误,因为未定义的方法等(LoginClient
可以有Client
没有的方法,它的子类)。
假设我有一个Server类,带有一个模板参数。我需要确保参数是另一个Client类的子类。在c++中可能吗?
你可以使用类型特征,特别是你可以通过std::enable_if
和std::is_base_of
一起启用类模板:
template<class T, class Enable = void>
class Server;
template <typename CLIENT>
class Server<CLIENT, typename std::enable_if<std::is_base_of<Client, CLIENT>::value>::type> {};
这样就有了层次结构:
class Client {};
class Derived : public Client {};
class NonDerived {};
以下代码可以编译:
Server<Derived> x;
,但下面的不会:
Server<NonDerived> x;
或者,正如评论中建议的,您可以在类中设置static_assert
:
template <typename CLIENT>
class Server {
static_assert(std::is_base_of<Client, CLIENT>::value, "CLIENT must be derived from Client");
// ...
};
相关文章:
- 将不同类型的变量添加到向量中
- 为自定义打印调试实现传递任何类型的变量
- 为<vtkDataArray> VTK 非结构化网格声明 vtkSmartPointer 类型的变量时出现问题
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 如何在 c++ 中从 switch 语句返回不同类型的变量
- 如何将整数分配给 char 类型的变量
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 如何定义int[][26]类型的变量
- 无法使用 'const Node *' 类型的右值初始化 'Node *' 类型的变量
- 声明具有两种类型的变量:"int char"
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- 如何将不同模板参数值但相同类型的值放入这种类型的变量中?C++
- 如何在循环中创建不同类型的变量?
- 如何访问在 c++ 中在类内声明的结构类型指针变量?
- 如何正确存储/传递接口类型的变量(现代 c++)?
- 声明嵌套在模板参数中的类型的变量?
- 根据模板函数类型推断变量的类型
- 如何在实例化类类型的变量时打印其名称
- 可用作数据类型的变量
- 常量表达式中引用类型的变量