Я испортил оператор запятой в конструкторе, чтобы я мог предварительно обработать параметры и использовать обработанный параметр для инициализации.
Скажем, у меня есть следующие базовые и производные классы:
class Base
{
protected:
int i;
int j;
public:
Base(int a):i(a),j(a){}
Base(int a, int b):i(a),j(b){}
};
class Derived:public Base
{
private:
int d;
void inc(int & a) {a++;}
void inc(int & a, int & b) {a++; b++;}
public:
Derived(int a, int b, int c);
};
Я знаю, что я могу использовать оператор запятой для обработки параметра и использовать его для инициализации базовой части следующим образом:
Derived::Derived(int a, int b, int c):Base((inc(a),a)),d(c){}
Теперь, если я хочу предварительно обработать два параметра и использовать их для инициализации базы? Я сделал следующее:
Derived::Derived(int a, int b, int c):Base((inc(a,b),(a,b))),d(c){}
Но это не то, что я хочу, потому что однопараметрический базовый конструктор будет по-прежнему использоваться (поскольку (a,b)
также является оператором запятой, который возвращает b
). Есть ли способ достичь того, чего я хочу, если запятая не возможна?
Хотя это может представлять собой просто мнение, я бы рекомендовал не писать такие выражения; вы ставите дополнительную нагрузку на сопровождающего, чтобы выяснить, что именно выполняется до того, как будет вызвана действительная функция; даже вычисляя количество аргументов, которые выполняет функция, потребует определенных усилий, поскольку в этом контексте запятые обычно используются только для разделения аргументов.
Для одного аргумента я бы сделал это следующим образом:
class Derived : Base {
static int computeSomething(int a) { return a+1; }
Derived(int a) :
Base(computeSomething(a)), ...
{ ... }
};
Примечание. Я возвращаю новое значение. Он может даже взять и вернуть по ссылке, если тип a
слишком дорог для копирования.
Для нескольких аргументов все, что нужно было обновить сразу, я бы изменил базу, чтобы получить весь пакет аргументов с именованным объектом или, может быть, std::tuple
, и сделать это как версию с одним аргументом.