2013-05-13 52 views
2

我有一個需要bool模板參數的類。該類將有幾個我需要專門研究類bool模板參數的方法。如果沒有專門研究整個班級,有沒有辦法做到這一點?bool值的C++類成員函數專精

美孚::酒吧()下面是我的意思的例子中,由於性病不起作用:: is_same可與類型,而不是值

感謝。

template<bool Mode> 
class Foo 
{ 
public: 
template<bool M=Mode, typename std::enable_if<std::is_same<M,true>::value>::type * = 0> 
void bar() 
{ 
    std::cout << "true" << std::endl; 
} 

template<bool M=Mode, typename std::enable_if<std::is_same<M,false>::value>::type * = 0> 
void bar() 
{ 
    std::cout << "false" << std::endl; 
} 
+0

['std :: is_same'](http://en.cppreference.com/w/cpp/types/is_same)比較**類型**。 'M'是一個常量,'true'和'false'是值,即它們不是類型。 – dyp 2013-05-13 19:22:56

回答

3

您不需要使用std::is_samestd::enable_if已經採用布爾參數:

template <bool Mode> 
class Foo 
{ 
    public: 
     template <bool M = Mode, typename std::enable_if<M>::type* = nullptr> 
     void bar() 
     { 
      std::cout << "true" << std::endl; 
     } 

     template <bool M = Mode, typename std::enable_if<!M>::type* = nullptr> 
     void bar() 
     { 
      std::cout << "false" << std::endl; 
     } 
}; 

這裏是一個demo

2

你在正確的軌道上。直接使用模板參數:

template<bool M=Mode, typename std::enable_if<M == true>::type * = 0> 
void bar()         //^^^^^^^^^^ 
{ 
    std::cout << "true" << std::endl; 
} 
8

也許我錯過了一些東西,但爲什麼不使用純粹的老專業?

template <bool M> 
struct base_template { 
    void bar(); 
}; 

template <> 
inline void base_template<true>::bar() { std::cout << "true\n"; } 
template <> 
inline void base_template<false>::bar() { std::cout << "false\n"; } 
+0

是的,我想我可以。我認爲如果我想專業化一門課程,我將不得不重新實現專門課程中的所有方法,但我發現情況並非如此。也就是說,我認爲enable_if代碼看起來更清晰並且更加可以理解,因爲函數的聲明聲明瞭專用的意圖。 – 2013-05-13 20:02:14

+0

@MK .:是嗎?您正在創建不同的重載,雖然它們可以通過SFINAE奇蹟般地消失,但您必須注意所使用的條件(即SFINAE檢查必須提供不相交的參數集或您會遇到不明確的錯誤)。同時,因爲它們是不相關的基本模板,所以沒有任何內容將一個接口綁定到另一個接口,因此您可以將其中一個定義中的參數/返回值誤認爲...這不是* specialization *,而是* overloading *。 – 2013-05-13 20:21:03