考慮這個例子的代碼:(Also on Ideone)如何強制一個靜態成員被初始化?
template<class D>
char register_(){
return D::get_dummy(); // static function
}
template<class D>
struct Foo{
static char const dummy;
};
template<class D>
char const Foo<D>::dummy = register_<D>();
struct Bar
: Foo<Bar>
{
static char const get_dummy() { return 42; }
};
我期望dummy
,因爲是Foo
一個具體的實例,我有Bar
得到儘快初始化。 This question(和最後的標準報價)解釋得很清楚,爲什麼沒有發生。
尤其是,靜態數據成員的初始化(以及任何相關的副作用)不會發生,除非靜態數據成員本身以需要定義靜態數據成員存在。
有什麼辦法來力dummy
進行初始化(有效調用register_
)沒有的Bar
或Foo
任何情況下(沒有實例,所以沒有構造欺騙)和無Foo
需要用戶明確以某種方式陳述會員?額外的餅乾不需要派生類來做任何事情。
編輯:Found a way對派生類的影響最小:
struct Bar
: Foo<Bar>
{ // vvvvvvvvvvvv
static char const get_dummy() { (void)dummy; return 42; }
};
不過,我還是想在派生類沒有做到這一點。 :|
我們一般不希望編譯器初始化所有類模板所有未使用的變量。在這種情況下,編譯器應該如何知道**你想要它?通過實際使用它? –
@Bo:當然,但我想隱藏派生類/外部世界的用法,並且寧願以某種方式將其用於'Foo'本身。 :/ – Xeo
@Xeo:'static char const get_dummy(){(void)dummy;返回42; }' - 我懷疑'Bar :: get_dummy()'和'Foo :: dummy'之間的這個循環依賴關係可以保證工作(通過標準)。看起來像高度依賴實施的技巧。我錯了嗎? –