Я хотел бы составить проблему в двух частях я вижу: во-первых, distiguishing по типу (A1, A2 по сравнению с B1, B2) и во-вторых, различие по инициализации переменных. Поскольку вы говорите, код все-таки, но типы не шаблоны приходят на ум. Так что моя первая попытка была бы:
template <class X1, class X2>
struct MyStrategy {
void foo()
{
X1 a = /* create appropiate X1 */;
X2 b = /* create appropiate X2 */;
// code that is the same for both except for the types...
}
};
Конечно функция будет иметь параметры и/или тип возвращаемого значения, но вы получите суть.
Теперь во вторую часть, которую я оставил в комментариях: инициализация значений. Я бы достиг этого, используя какой-то политический дизайн. Первый эскиз:
template <class X1, class X2>
struct X1X2Creator;
template <>
struct X1X2Creator<A1, A2> {
A1 createX1() { return function1_A(); }
A2 createX2() { return function2_A(); }
};
template <>
struct X1X2Creator<B1, B2> {
B1 createX1() { return function1_B(); }
B2 createX2() { return function2_B(); }
};
template <class X1, class X2>
struct MyStrategy : X1X2Creator<X1, X2> {
void foo()
{
X1 a = this->createX1();
X2 b = this->createX2();
// code that is the same for both except for the types...
}
};
Примечание Вы должны вызвать создания-функций с помощью this->createX1()
, из-за их зависимых имен, в противном случае компилятор должен жаловаться. Вы также можете четко определить функции (X1X2Creator<X1, X2>::createX1()
).
Вы можете улучшить этот дизайн по вашим потребностям, например. не используя наследование, а создавая экземпляр X1X2Creator и вызывая функции или ставя их. Если вы хотите использовать больше комбинаций различных типов, использовать одну политику создания по типу:
template <class X1, class X2>
struct MyStrategy {
void foo()
{
X1 a = CreationPolicy<X1>::create();
X2 b = CreationPolicy<X2>::create();
// code that is the same for both except for the types...
}
};
Если вы хотите, чтобы иметь возможность использовать различные политики для одних и тех же типов, обеспечивают классы Policie в качестве параметров шаблона:
template <class X1, class X2,
class X1Creator = CreationPolicy<X1>,
class X2Creator = CreationPolicy<X2>>
struct MyStrategy {
void foo()
{
X1 a = X1Creator::create();
X2 b = X2Creator::create();
// code that is the same for both except for the types...
}
};
HTH
Tyvm для ответа. У меня есть два вопроса. 1 - В чем разница между структурой и классом? Я думал, что разница в структурах не может иметь функций. 2- Так что в вашем коде вы говорите, что у вас могут быть шаблоны, а для конкретных значений - конкретные вещи? – pb2plus
** 1. ** Единственное отличие состоит в том, что доступ по умолчанию для structs является * public *, а для класса - * private *. То есть для членов, а также для наследования. ** 2. ** С этими шаблонами вы делаете конкретные вещи для определенных * типов *, а не значений. –