Рассмотрим следующий класс строителя -like, который в конечном итоге позволяет мне построить объект с определенными (runtime) значениями для переменных-членов, а также встраивание некоторого поведения, которое переносится несколькими типами времени компиляции.
Такая же сборка позволяет обновлять переменные-члены (обычный шаблон-застройщик), а также изменять параметры типа шаблона, связанные с состоянием типа конструктора (только с несколькими параметрами и членами шаблона, но на практике, будет больше):
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*
метода withT*
может просто вызвать копию.
Однако мне непонятно, как избежать включения в вызов полностью квалифицированного типа Builder
:
template <typename T1_NEW>
Builder<T1_NEW, T2 > withT1() { return copy<T1_NEW, T2>(); }
Здесь лечение хуже, чем исходный яд, так как мне нужно квалифицировать каждый вызов для копирования с помощью <T1_NEW, T2>
(и это различно для каждого withT*
). Есть ли способ ссылаться на тип возврата или другой тип вывода, который я могу использовать для вызова copy()
одинаково в каждой функции?
Я пишу на С++ 11, но обсуждение того, как можно улучшить решение С++ 11 в более поздних стандартах, также приветствуется.