2012-11-06 40 views
3

我很新到std :: enable_if,不知道如何使用它。 我有一個模板類:C++的std :: enable_if

template<int a, int b> 
class foo { 
} 

現在我只希望它實例化時,A + B等於10 我能把這可能使用的std :: enable_if?

第二個問題: 如果我有類Foo的成員

template<int a, int b> 
class foo { 
    int c; 
} 

我只希望有c當

a = 5. 

我該怎麼做,使用的std :: enable_if? 這是一個正確的情況下使用std :: enable_if?

+2

這不是什麼'enable_if'是。它僅用於*函數*模板中的推導*類型。 –

+2

@KerrekSB:或者禁用類模板的特化。兩者都是'boost :: enable_if'的核心用法很長一段時間,兩者仍然是有效的用例。請注意,這通常是在基礎模板的多個專業化背景下完成的,以便選擇其中一個,而不僅僅是完全禁用模板。 –

+0

@DavidRodríguez-dribeas:這是一個很好的點。到目前爲止,我還沒有用它來進行類模板專業化... –

回答

12

我想你可以使用static_assert更好地執行這一約束,而不是enable_if

template<int a, int b> 
class foo { 
    static_assert(a+b==10, "a+b is not 10"); 
}; 

int main() 
{ 
    foo<5,5> f; // will compile 
    foo<1,5> f; // will fail to compile with error: a+b is not 10 
    return 0; 
} 

enable_if主要用於基礎型性狀有條件地移除重載函數和類,並提供單獨的函數重載和專業針對不同類型的特徵。

+2

我會選擇一個基於'std :: enable_if'的解決方案,以免我的庫的用戶感到頭疼。 –

+0

是的,我只是想學習如何使用enable_if。但它可能是這種情況,這是一個非常糟糕的例子:) – WhatABeautifulWorld

11
template<int a, int b, typename T = typename std::enable_if<a + b == 10>::type> 
class foo { 
}; 

這應該做的工作;只要確保在實例化模板時從不顯式提供第三個模板參數。


正如其他人提到的,static_assert是一個更好的選擇。

+3

+1:雖然只是強制一個特定的組合'static_assert'是更好的,這是更強大的,因爲它允許生成基本模板的多個專業化,並根據模型參數 –

+0

+1的屬性選擇一個或另一個用於教導我可以在模板參數中使用算術和邏輯表達式 –

+0

This一個不編譯...... – WhatABeautifulWorld

3

簡單,只是不使用enable_if

template<bool Ten> 
struct Base 
{ 
    int c; 
}; 

template<> 
struct Base<false> 
{ }; 

template<int a, int b> 
struct foo : Base<a+b == 10> 
{ 
}; 
相關問題