vla*_*sch 3 c++ default-arguments
考虑到下面提供的以下代码/方案,是否有可能省略指定 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;
}
Run Code Online (Sandbox Code Playgroud)
您可以添加一个成员函数来为您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};
}
};
Run Code Online (Sandbox Code Playgroud)
然后我们可以将其用作
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
};
Run Code Online (Sandbox Code Playgroud)