在base中修改对象但返回指向派生类的指针

时间:2014-11-20 19:55:15

标签: c++ templates

我有一种对象注册表,可以在其中注册对象。这应该在初始化阶段完成。 E.g。

class ObjectBase {
protected:
   bool active;

public:
   void activate() { active = true; }
};

template<typename T>
class Object : public ObjectBase {
   T value;
};

class Registry {
public:
   template<typename T>
   static std::shared_ptr<Object<T>> registerObject() {
      return std::make_shared<Object<T>>();
   }

namespace {
   std::shared_ptr< Object<int> > myObject = Registry::registerObject<int>();
}

现在我想在初始化时设置active值(并且构造函数参数不是一个选项,因为这只是众多中的一个)。如果我能够做到以下几点,那将是多么简洁:

namespace {
   std::shared_ptr< Object<int> > myObject = Registry::registerObject<int>()->activate();
}

但是我没有看到一种方法让activate()返回一个Object类型的指针(除非我把它作为一个模板并进行动态转换,但这看起来很难看),以免共享指针。还是有某种方法?或者,您是否有人建议如何处理此任务(即注册某些内容并设置多个属性)?

编辑:

命名我的班级Object可能是不幸的。作为一个实际例子,将Object视为属性(持有一个整数)。显然可能有多个整数属性。并想象&#34;活跃&#34;类似于&#34;应该备份&#34; /&#34;应该与远程进程同步&#34; / ...

3 个答案:

答案 0 :(得分:0)

template<typename T>
std::shared_ptr< Object<T> > RegisterAndActivate() {
  std::shared_ptr< Object<T> > p = Registry::registerObject<T>();
  p->activate();
  return p;
}

namespace {
   std::shared_ptr< Object<int> > myObject = RegisterAndActivate<int>();
}

答案 1 :(得分:0)

独立功能怎么样:

template <typename T>
std::shared_ptr<Object<T>> activate(std::shared_ptr<Object<T>> ptr) {
    ptr->activate();
    return ptr;
}

然后

auto x = activate(Registry::registerObject<int>());

答案 2 :(得分:0)

好的,这就是我想出的:

#include <iostream>
#include <tuple>
#include <memory>


struct Test {
    bool a;
    bool b;
    Test() : a(false),b(false) {};
};


template<typename T, bool T::* ... props>
std::shared_ptr<T> activate(std::shared_ptr<T> inst) {
    std::tie((inst.get()->*props)...) = std::make_tuple((props,true)...);
    return inst;
}

int main()
{
    auto t1 = activate<Test,&Test::a>(std::make_shared<Test>());
    auto t2 = activate<Test,&Test::a,&Test::b>(std::make_shared<Test>());
    std::cout << "t1: a = " << t1->a << ", b = " << t1->b << std::endl;
    std::cout << "t2: a = " << t2->a << ", b = " << t2->b << std::endl;
}

基本上,无论你指定为bool成员的指针作为模板参数,都会被activate函数设置为true。这样,您就不必编写许多激活函数,但由于所有Classname::classmember表达式,它仍然需要大量编写。工作示例here