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

时间:2017-11-23 21:20:59

标签: c++ crtp

假设我有一个类,它通过映射中的代理类存储对派生类成员变量的引用。此地图填充在名为let 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_;
 };

我知道这不是一个好的模式,因为我做了一件坏事 - 在运行构造函数之前访问派生类成员变量,但我只存储引用,所以我不会弄乱这个起来并开始用它们做任何事情这应该没问题。也就是说,是否存在我忽略的任何案例/场景,并且调用foo()只会将引用存储在地图中会导致任何错误?

0 个答案:

没有答案
相关问题