我在构造函数中破坏了逗号运算符,这样我就可以预处理参数并使用处理过的参数进行初始化。
说我有以下基类和派生类:
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
)的逗号运算符。无论如何,如果不能使用逗号运算符,是否可以实现我想要的目标?
答案 0 :(得分:4)
虽然这只是一种意见,但我建议不要写这样的表达;你正在给维护者增加额外的负担,以确定在调用实际函数之前究竟执行了什么;即使计算出函数所需的参数数量也需要付出一些努力,因为逗号通常只在该上下文中用于分隔参数。
对于单个参数,我会这样做:
class Derived : Base {
static int computeSomething(int a) { return a+1; }
Derived(int a) :
Base(computeSomething(a)), ...
{ ... }
};
注意我正在返回一个新值。如果a
的类型太昂贵而无法复制,它甚至可以通过引用获取和返回。
对于多个参数,所有需要立即更新,我会更改基数以接收带有命名实体的整个参数包,或者可能是std::tuple
,并且像单参数版本一样