假设我有一个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
的方法1}}没有,它是子类)。
答案 0 :(得分:2)
我们说我有一个带有模板参数的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;
但是以下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");
// ...
};