2014-11-20 100 views
-1

我有一種可以註冊對象的對象註冊表。這應該在初始化階段完成。例如。修改基於對象的對象,但返回指向派生類的指針

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(); 
} 

但是我沒有看到激活方式()返回Object類型的指針(除非我使它成爲一個模板,以及和做一個動態的演員,但這看起來很醜陋),以免共享指針。或者有什麼方法?或者,你們有沒有建議如何處理這個任務(即註冊一些東西並設置一些屬性)?

編輯:

定名我Object類可能是不幸的。作爲一個實際的例子,將Object看作一個屬性(保存一個整數)。顯然可能有多個整數屬性。和想象「活動」作爲一個類似於「應該備份」 /「應該用遠程進程同步」/...

+0

是不是有一個原因,你不能在ObjectBase的構造函數中調用'activate()'? – 2014-11-20 20:03:22

+0

因爲我目前有4個這樣的布爾值更可能來。 – BillP 2014-11-20 20:07:41

+0

如果是這種情況,那麼需要更多信息才能正確回答問題。例如,有沒有一種情況是你不想在構建對象時激活一個對象? – 2014-11-20 20:11:23

回答

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>(); 
} 
+0

這種方法的問題是,目前有4個這樣的布爾值有更多的未來。有一個特定的寄存器函數爲每一個他們(和每個組合)是我真的想避免的:-) – BillP 2014-11-20 20:08:33

+0

有一個寄存器函數採用四個布爾變量作爲參數(或一個位集,或任何你想要的結構用來表示對象的期望狀態)。 – 2014-11-20 20:09:38

+0

當我有20個變量?這不會縮放。 – BillP 2014-11-20 20:10:40

0

關於獨立功能(S)什麼:

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>()); 
+0

如果其他風格不可行,這可能是一個選項,是的。 – BillP 2014-11-20 21:08:27

+0

@BillP有了你可能會變得複雜,讓registerObject返回一個代理轉換爲'std :: shared_ptr >',適用於一些逗號運算符(激活,停用,...) - 也許你的設計是可疑的! – 2014-11-20 21:23:41

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。這樣,您不必編寫許多激活函數,但由於所有的表達式都是大量寫入的。工作示例here

相關問題