Рассмотрим следующий подобный строителю -подобный класс, который в конечном итоге позволяет мне создать объект с обоими определенными (во время выполнения) значениями для переменных-членов, а также внедрить некоторое поведение, которое выполняется несколькими (compile-time) types.
Та же сборка позволяет обновлять переменные-члены (обычный шаблон компоновщика), а также изменять параметры шаблона type , связанные с переносимым типом состоянием компоновщика (показывается только с парой параметров и членов типа шаблона, но на практике их будет больше):
template <typename T1 = DefaultT1, typename T2 = DefaultT2>
class Builder {
int param1, param2;
Builder(int param1, int param2) : param1{param1}, param2{param2} {}
public:
Builder() : Builder(default1, default2) {}
// methods to change param1 and param2 not shown
/* return a new Builder with T1 changed to the given T1_NEW */
template <typename T1_NEW>
Builder<T1_NEW, T2 > withT1() { return {param1, param2}; }
template <typename T2_NEW>
Builder<T1 , T2_NEW> withT2() { return {param1, param2}; }
Foo make() {
// uses T1 and T2 to populate members of foo
return Foo{ typename T1::member, typename T2::another };
}
};
Обратите внимание на методы withT1<>
и withT2<>
, которые позволяют возвращать нового компоновщика сдругой тип для T1
или T2
соответственно.Тела для этих методов идентичны: return {param1, param2};
, и на практике гораздо сложнее, чем показано здесь (например, если имеется много параметров).
Я бы хотел выделить тело в некоторый метод, которыйвыполняет конструкцию, такую как:
template <typename T1_, typename T2_>
Builder<T1_, T2_> copy() { return {param1, param2}; }
, а затем каждый метод withT*
может просто вызвать копирование.
Однако мне не ясно, как избежать включения полностью определенного типаBuilder
в вызове:
template <typename T1_NEW>
Builder<T1_NEW, T2 > withT1() { return copy<T1_NEW, T2>(); }
Здесь лечение хуже, чем исходный яд, так как мне нужно квалифицировать каждый вызов копирования с помощью <T1_NEW, T2>
(и это отличается для каждого метода withT*
),Есть ли какой-то способ, которым я могу ссылаться на тип возвращаемого значения или другой тип вывода, который я могу использовать для вызова copy()
таким же образом в каждой функции?
Я пишу на C ++ 11, нообсуждение того, как решение C ++ 11 может быть улучшено в более поздних стандартах, также приветствуется.