2016-03-03 124 views
1

我對模板沒有太多的經驗,但我想知道下面的情況是否可行。假設我們有一個擁有靜態成員stat的S類。我可以得到它的typeid使用作爲動態生成不同的代碼:基於靜態成員類型的模板功能專業化

 
    template &ltclass S> 
    void foo() 
    { 
     if (typeid(S::stat) == typeid(AType)) 
      implementation 1; 
     else 
      implementation 2; 
    } 

但是,由於所有的信息在編譯時是已知的是有可能創造的foo與S的專業化::型A型的統計之中?

回答

0

你可能希望做這樣的事情:

template<typename T> class foo_impl { 

public: 

    static void foo() 
    { 
      // This is your implementation 2 
    } 
}; 

template<> class foo_impl<AType> { 

public: 

    static void foo() 
    { 
      // This is your implementation 1 
    } 
}; 

template <class S> 
    void foo() 
    { 
     foo_impl<typename S::Stat>::foo(); 
    } 
+0

foo_impl <類型名稱的s :: stat>的:: foo的(); 這與Visual Studio生成以下錯誤:錯誤 C2143:語法錯誤:缺少 '' 前 'MyClass的:: _ stat64中' MyClass的::統計是一個靜態常量變量。它可以作爲typename S :: stat的引用嗎? –

+0

@KostasKyriakopoulos您需要爲變量選擇與「stat」不同的名稱。該名稱與來自C庫的stat()系統調用衝突。 –

0

一個解決這個問題的常用方法是通過標籤分發。我們可以在編譯時,產生不同類型對於是否S::stat比賽AType - 並使用這些類型調用不同的重載:

template <class S> 
void foo() { 
    foo_impl(std::is_same<decltype(S::stat), AType>{}); 
} 

void foo_impl(std::true_type /* S::stat matches AType */) { 
    // implementation 1 
} 

void foo_impl(std::false_type /* S::stat doesn't match AType */) { 
    // implementation 2 
} 
0

我是不是能夠利用decltype解決方案,因爲我的編譯器不支持它。

我能夠利用foo_impl類解決方案,但只有當我聲明MyClass的爲:

class MyClass { public: typedef AType Stat; static const Stat stat = VAL; ... }