2016-03-18 112 views
1

我已閱讀有關爲什麼static virtual方法沒有任何意義 - 或者函數是virtual,因此它可以被實現覆蓋,或者它是static,因爲類型在編譯時是已知的,不能兼得。我不知道是否有一種方法做什麼我想:C++靜態模板子類

我有相同的基本結構在一些預配置值讀:

// in some header 
template < typename TYPE > 
class Reader { 
public: 
    static TYPE getValue() { 
     static TYPE value; 
     static SomeFileClass(filename, &value, sizeof(value)); 
     return value; 
    } 
}; 

class OneValue : public Reader<uint16_t> { 
public: 
    static const char* filename; 
}; 
// and maybe OtherValue : public Reader<SomeUserType> {}; etc etc. 

// in main.cpp, for example 
const char* OneValue::filename = "onevalue.txt"; 

這一點,並在此進行各種變化,失敗。首先它說filename沒有在Reader中聲明,這聽起來很合理;所以後來我在那裏宣佈了一個static const char* filename,並且故意將Reader::filenameOneValue::filename相關聯,因爲當我稍後使用它時,我會打電話給OneValue::getValue() - 我知道我叫它時的類型。

但是,這是行不通的,因爲Reader::filename沒有定義,但是當我定義它時,它表示模板沒有使用模板參數,這聽起來像是一個合理的錯誤,但現在我沒有想法。

有沒有辦法乾淨地做我想要的,沒有大量的代碼複製?我接受全新的公式,只是希望它清晰簡明 - 上面的代碼,雖然它有人爲的名字,實際上是我希望實現的整個Reader類,所以在每個類中重新定義一些getValue()派生類比預期的工作更多,因爲它可能需要更多的線來派生和重寫,而不是僅爲每個類重新實現getValue()

回答

4

通常解決這類問題是CRTP

template < typename TYPE, typename Derived > 
//      ^^^^^^^^^^^^^^^^^^ 
class Reader { 
public: 
    static TYPE getValue() { 
     static TYPE value; 
     static SomeFileClass(Derived::filename, &value, sizeof(value)); 
     //     ^^^^^^^^^ 
     return value; 
    } 
}; 

class OneValue : public Reader<uint16_t, OneValue> { 
//          ^^^^^^^^^^ 
// etc. 
}; 
+0

啊,我看到的是一個在提到另一個問題,但起初並不完全理解。 – dwanderson

+0

現在這樣做更有意義。真棒,謝謝,正是我需要的! – dwanderson