Является ли частичная специализация шаблона класса ответом на эту проблему проектирования?
Скажем, у вас есть класс, который занимается подключением к удаленному серверу. Я хочу абстрагировать этот класс для предоставления двух версий, одна из которых подключается через UDP, а другая - через TCP. Я хочу создать наименьший возможный код времени выполнения и вместо использования полиморфизма я рассматриваю шаблоны. Вот что я представляю, но я не уверен, что это лучший способ сделать это:
class udp {};
class tcp {};
template<class T,typename X>
class service
{
private:
// Make this private so this non specialized version can't be used
service();
};
template<typename X>
class service<udp, X>
{
private:
udp _udp;
X _x;
};
template<typename X>
class service<tcp, X>
{
private:
tcp _tcp;
X _x;
};
Таким образом, конечным преимуществом является то, что универсальность T по-прежнему доступна, но совершенно другой код, необходимый для настройки соединения UDP или TCP, был специализированным. Я полагаю, что вы можете поместить его оба в один класс или предоставить другой класс, который придерживается какого-то чисто виртуального интерфейса для настройки сетевого подключения, такого как IConnectionManager.
Но это оставляет проблему кода для универсального T, который теперь нужно записывать и поддерживать в обеих специализированных версиях, где они в конечном итоге одинаковы. Как лучше всего это решить? У меня такое чувство, что я все об этом говорю неправильно.