我已經寫了一類具有下列靜態方法:C++函數與在文件範圍內使用的副作用,訪問單
MyMap& Manager::GetMap(void)
{
static MyMap* factories = new MyMap();
return (*factories);
}
其中「MyMap中」是一個typedef:
unordered_map<string, function<Base* (Dependency& d)>>
也有從基地派生的各種類型,例如
class Derived1 : public Base
{
public:
Derived1(Dependency& d);
};
請考慮以下用法。
我定義爲Derived1實現文件如下:
#include "Derived1.h"
#include "Manager.h"
int RegisterDerived1(void)
{
Manager::GetMap()["Test"] = [](Dependency& d){ return new Derived1(d); };
return 0;
}
int Reg = RegisterDerived1();
你不能說在文件範圍內的功能,但是你可以一個函數的返回值賦給一個全局變量,即使該功能有副作用。因此,在使用「管理器」時,「MyMap」將包含用於各種派生類型的「基本」(到目前爲止)的字符串/函數對。意圖是新的派生類型的「基礎」註冊自己與「經理」,能夠構建該類型的實例,並根據名稱選擇哪種類型。
我想知道如果這代表安全的行爲和/或是否有替代實現,以獲得預期的效果?
我已經意識到在這篇文章中提出了一種通用的登記對象,需要在其構造上述一對並執行登記的,一個靜態實例,其中被定義爲要被註冊的每一個類。
http://accu.org/index.php/journals/597
看來,你基本上是問「延遲初始化」和其他相關的代碼的東西都沒有太大的相關性。你覺得,這篇文章回答你的Q:[單身模式懶惰初始化](http://stackoverflow.com/q/21252296/514235)。如果是,那麼它可以作爲重複關閉。 – iammilind
@iammilind我很清楚單個實現的行爲,這是我認爲這個問題的關鍵。我只是包含了其他位的上下文。我不太清楚的是在文件範圍使用上述自由函數的含義。這感覺就像一件壞事,因爲我需要解決一個限制。 –