泛型类型,其中类型变量必须具有特定的类型

C++ - generic type where type variable must have specific type

本文关键字:类型 类型变量 泛型类型      更新时间:2023-10-16

假设我有一个Server类,带有模板参数。我需要确保参数是另一个Client类的子类。在c++中可能吗?

例如,给定如下内容:

template <typename CLIENT>
class Server {
  void addClient(CLIENT client);
};

我期待这样的东西:

template <typename CLIENT : Client>
class Server {
  void addClient(CLIENT client);
}

我想有LoginServerGameServer,两者都基于Server类,但每个将与不同的Client子类一起工作。

class LoginServer : public Server<LoginClient>
class GameServer : public Server<GameClient>

我不想在LoginServer内重新键入所有Client类型到LoginClient,否则编译器会抛出错误,因为未定义的方法等(LoginClient可以有Client没有的方法,它的子类)。

假设我有一个Server类,带有一个模板参数。我需要确保参数是另一个Client类的子类。在c++中可能吗?

你可以使用类型特征,特别是你可以通过std::enable_ifstd::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");
    // ...
};