C ++ - 泛型类型,其中类型变量必须具有特定类型

时间:2014-03-17 22:33:32

标签: c++ templates

假设我有一个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的方法1}}没有,它是子类)。

1 个答案:

答案 0 :(得分:2)

  

我们说我有一个带有模板参数的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 {};

以下would compile

Server<Derived> x;

但是以下wouldn't

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");
    // ...
};