PGCafe
Lv 5
PGCafe 發問時間: 電腦與網際網路程式設計 · 8 年前

template 用法的兩個問題

第一個問題是能不能對模板參數使用template

模板參數可以分成型別參數和常數參數,主要是想對常數參數使用未定型別

template <typename Type, int number> // 一般的用法

template <typename Type, typename Type2 number> // 我想要的用法

主要是在於需要傳入常數參數而不是傳入型別,但是那個常數參數又不是固定的型別。

這個問題很久以前就遇過,而且也一直遇到...不過都是用其他方式取代,有點捨近求遠。不知道是什麼原因標準不提供類似用法,auto 也不行。

==============================

第二個問題是...看程式碼比較容易懂

// 模板參數是( T, T的pointer to member )

template <class T, T *T::* Member> class Class1{};

// 模板參數傳入自己還有自己的pointer to member

class Class2 : public <Class2, &Class2::m> { // 這裡錯誤

Class2 *m;

}; // class Class2

錯誤訊息是 m 沒有宣告。

應該是因為在繼承的時候還沒宣告 m 的關係,可是不知道有什麼方法可以處理。

已更新項目:

===============================

To :【帕拉提斯】

關於第一個問題,這個方法我有想過,不過我是想避免多傳入型別這一方法。

其一是因為我想讓用起來更直觀?!方便

其二是因為也許型別不是這麼簡單的int, char,可能是function, pointer to number

雖然c++11 應該可以用decltype 解決,不過這樣還是有點多此一舉。

===

第二個問題,看來目前也許只能妥協了。

其實也不是為了is-a關係而繼承的,只是為了方便性。

1 個解答

評分
  • 其威
    Lv 7
    8 年前
    最佳解答

    1.

    說真的我不知道那個 number 的學名應該叫什麼(非型別 template 引數?template 常數?template 變數?)...

    但是既然你不能確定它的型別,就讓它的型別也變成一個 template 引數即可...

    template < typename T1, typename T2, T2 number >

    class MyClass

    {

    };

    MyClass< std::string, int, 10 > obj1;

    MyClass< std::vector< int >, char, 'A' > obj2;

    2.

    因為你的 Class2 繼承自 Class1,但是具現化 Class1 的時候又需要 Class2...

    於是它就變成一個先有雞還是先有蛋的問題 = =

    所以,你只能使用其他耦合性低的方法(例如 has-a),不能使用繼承這種耦合性高的方法(is-a)。

    2012-08-18 04:44:20 補充:

    訂正一下...

    「具現化 Class1 的時候又需要 Class2」

    應為

    「具現化 Class1 的時候又需要 Class2 的 member(pointer to member)」

    這時 Class2 還是個 incomplete type,無法推定其中各 member 的所在位置。

    2012-08-19 04:50:19 補充:

    template argument 是用來 resolve runtime argument 的 type,你連 template argument 的 type 都想讓他自己 resolve...

    這我還真不知道該怎麼辦 XD

還有問題?馬上發問,尋求解答。