C++ 访问基类构造函数中的派生成员引用

C++ 访问基类构造函数中的派生成员引用,c++,crtp,C++,Crtp,假设我有一个类,它通过映射中的代理类存储对派生类成员变量的引用。此映射填充在一个名为foo()的函数中。它可能看起来像这样: #include <map> #include <memory> class property_base { }; template<typename T> class property : public property_base { public: property(T& propert

假设我有一个类,它通过映射中的代理类存储对派生类成员变量的引用。此映射填充在一个名为
foo()
的函数中。它可能看起来像这样:

 #include <map>
 #include <memory>

 class property_base
 {
 };    

 template<typename T>
 class property : public property_base
 {
 public:
    property(T& property) : property_(property)
    {
    }

 private:
     T& property_;
 };

 template<typename T>
 class base
 { 
 public:
     base()
     {
         static_cast<T*>(this)->foo();
     }

 protected:
     std::map<std::string, std::unique_ptr<property_base>> properties_;
 };

 class derived : public base<derived>
 {
 public:
     void foo()
     {
         properties_.emplace("member", std::unique_ptr<property_base>(new property<int>(value_)));
     }
 private:
     int value_;
 };
#包括
#包括
类属性库
{
};    
模板
类属性:公共属性\u基
{
公众:
属性(T&property):属性(property)
{
}
私人:
T&property;
};
模板
阶级基础
{ 
公众:
base()
{
静态_cast(this)->foo();
}
受保护的:
std::映射属性;
};
派生类:公共基
{
公众:
void foo()
{
属性放置(“成员”,std::unique_ptr(新属性(值));
}
私人:
int值;
};

我知道这被认为不是一个好模式,因为我做了一件坏事——在运行派生类成员变量的构造函数之前访问它们,但我只存储引用,只要我不把它弄糟并开始用它们做任何其他事情,这应该是好的。也就是说,有没有我忽略的情况/场景,调用只在映射中存储引用的
foo()
会导致任何错误?

如果
base
有一个受保护的构造函数使用类似于
std::initializer\u list
的东西,那么这段代码就会容易得多。“它在映射中存储对派生类成员变量的引用“-你不能在地图中存储引用。@ChristianHackl fair point,没想到:)@François Andrieux-我能读代码。非常感谢。我的观点是在术语和描述事物的方式上要精确。地图包含
unique\u ptr
s,而不是参考。这么说吧。你不在
派生的
类构造函数中添加属性有什么原因吗?如果
base
有一个受保护的构造函数,它采用类似于
std::initializer\u list
“在映射中存储对派生类成员变量的引用”,那么这段代码就会容易得多-你不能在地图中存储引用。@ChristianHackl fair point,没想到:)@François Andrieux-我能读代码。非常感谢。我的观点是在术语和描述事物的方式上要精确。地图包含
unique\u ptr
s,而不是参考。这么说吧。你为什么不在
派生的
类构造函数中添加属性?