使函数参数默认为周围范围

make function argument default to surrounding scope

本文关键字:周围 范围 默认 函数 参数      更新时间:2023-10-16

考虑到下面提供的以下代码/方案,是否可以以某种方式省略指定this的必要性?

有没有办法更改代码,以便函数/构造函数自动获取周围的范围,甚至可能作为模板参数?

#include <iostream>
class AttrBase{
public:
virtual int g()const = 0;
};
class ABase{
public:
void reg(const char* name, AttrBase* att){
std::cout << name << ": " << att->g()<< std::endl;
}
};

class Attr : public AttrBase{
public: 
Attr(const char* name, int val, ABase* parent /* = this */) // something like this
:v(val)
{ 
parent->reg(name, this);
};
int g()const override{return  v;};
int v;
};

class D:public ABase{
Attr a{"a", 1, this};
Attr b{"b", 2, this};
Attr c{"c", 3};    //< is this somehow possible
};
int main(){
D d;
}

您可以向ABase添加一个成员函数,以便为您创建Attr

class ABase{
public:
void reg(const char* name, AttrBase* att) {
std::cout << name << ": " << att->g()<< std::endl;
}
protected:
template <typename AttrType, typename... Args>
AttrType make(Args&&... args) {
return AttrType{std::forward<Args>(args)..., this};
}
};

然后我们可以将其用作

class D:public ABase {
Attr a = make<Attr>("a", 1);
auto b = make<Attr>("b", 2); // works with auto to avoid specifying the type twice
};