这最好使用传输协议的策略来完成:
template<typename Transport>
class service : Transport {
public:
typedef Transport transport_type;
// common code
void do_something() {
this->send(....);
}
};
class tcp {
public:
void send(....) {
}
};
class udp {
public:
void send(....) {
}
};
typedef service<tcp> service_tcp;
typedef service<udp> service_udp;
请注意,这也是多态的。它被称为编译时多态性。将策略放入基类将受益于 Empty-Base-Class-Optimization。也就是说,您的基类不需要占用任何空间。将策略设置为成员还有另一个缺点,即您总是必须将事情委派给该成员,这可能会随着时间的推移而变得烦人。Modern C++ Design一书深入描述了这种模式。
理想情况下,传输协议不需要知道任何关于它上面的协议的信息。但是如果由于某种原因你必须得到一些关于它的信息,你可以使用 crtp 模式wiki:
template<template<typename Service> class Transport>
class service : Transport<service> {
// since we derive privately, make the transport layer a friend of us,
// so that it can cast its this pointer down to us.
friend class Transport<service>;
public:
typedef Transport<service> transport_type;
// common code
void do_something() {
this->send(....);
}
};
template<typename Service>
class tcp {
public:
void send(....) {
}
};
template<typename Service>
class udp {
public:
void send(....) {
}
};
typedef service<tcp> service_tcp;
typedef service<udp> service_udp;
您不必将模板放入标题中。如果您显式实例化它们,您将获得更快的编译时间,因为需要包含的代码更少。将其放入 service.cpp:
template class service<tcp>;
template class service<udp>;
现在,使用服务的代码不需要知道服务的模板代码,因为该代码已经生成到 service.cpp 的目标文件中。