Если у меня есть конструктор с, говорят, что 2 обязательных параметра и 4 дополнительных параметра, как я могу постараться не писать 16 конструкторам или даже этим приблизительно 10 конструкторам, которых я должен был бы записать, использовал ли я параметры по умолчанию (который я не люблю, потому что это - плохое самодокументирование)? Есть ли какие-либо идиомы или шаблоны использования методов, которые я могу использовать для создания этого менее утомительным? (И легче поддержать?)
Возможно, вас заинтересует Идиома именованных параметров .
Подводя итог, создайте класс, содержащий значения, которые вы хотите передать конструктору (конструкторам). Добавьте метод для установки каждого из этих значений, и пусть каждый метод будет возвращать return * this;
в конце. Имейте в своем классе конструктор, который принимает константную ссылку на этот новый класс. Это можно использовать так:
class Person;
class PersonOptions
{
friend class Person;
string name_;
int age_;
char gender_;
public:
PersonOptions() :
age_(0),
gender_('U')
{}
PersonOptions& name(const string& n) { name_ = n; return *this; }
PersonOptions& age(int a) { age_ = a; return *this; }
PersonOptions& gender(char g) { gender_ = g; return *this; }
};
class Person
{
string name_;
int age_;
char gender_;
public:
Person(const PersonOptions& opts) :
name_(opts.name_),
age_(opts.age_),
gender_(opts.gender_)
{}
};
Person p = PersonOptions().name("George").age(57).gender('M');
Что, если бы вы создали объект параметра, содержащий все поля? Затем вы можете просто передать это и просто установить любые поля, которые вам нужны. Возможно, у этого шаблона есть название, но не знаю, что это такое ...
ОБНОВЛЕНИЕ:
Код может выглядеть примерно так:
paramObj.x=1;
paramObj.y=2;
paramObj.z=3;
paramObj.magic=true;
... //set many other "parameters here"
someObject myObject = new someObject(paramObj);
и внутри конструктора someObject
вы можете установить значения по умолчанию для вещей, которые еще не были установлены (или вызывают ошибку, если это было обязательно).
Честно говоря, я не большой поклонник этого решения, но я использовал его один или два раза, когда paramObj
имел смысл, поскольку содержал набор данных, которые обычно все вместе (чтобы мы могли использовать его не только для конструкторов), и это было лучше, чем для нескольких конструкторов. Я обнаружил, что это было некрасиво, но это сработало, YMMV.
А теперь ответ на вопрос «У Boost есть кое-что для этого»:
Библиотека параметров ускорения , кажется, хорошо подходит для вашего случая использования.