我有一种对象注册表,可以在其中注册对象。这应该在初始化阶段完成。 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; / ...
答案 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。