2016-05-12 70 views
1

假設我有一個功能:有沒有辦法給std :: conditional fail更好的錯誤?

template<typename T, typename Dummy = 
          typename std::enable_if<std::is_integral<T>::value,int>::type > 
void foo(T var0, T var1); 

如果T是一些整數類型此功能僅創建。唯一的問題是,如果我嘗試在非整數類型上使用它,我會得到這個巨大的錯誤。

有沒有什麼辦法來創建一個類似的情況下發生的自定義錯誤字符串?

+0

其實,你的例子甚至不工作對我來說:http://coliru.stacked-crooked.com/a/edfd2163b75a8b12 –

+0

@BaummitAugen這將失敗,因爲雙打都沒有積分 – DarthRubik

+0

我拿到那是應該發生,但gcc和clang不會發生這種情況。 Tbh,我不知道爲什麼。如果你關心,可能值得一個額外的問題。 –

回答

3

剛落假把戲和使用static_assert,這就像一本教科書的用例:

#include <type_traits> 

template <class T> 
void fun(T t){ 
    static_assert(std::is_integral<T>::value, "fun requires integral"); 
} 

int main(){ 
    fun(1); 
    fun(2.); 
} 

失敗了比較明確的信息:

main.cpp: In instantiation of 'void fun(T) [with T = double]': 
main.cpp:10:11: required from here 
main.cpp:5:5: error: static assertion failed: fun requires integral 
    static_assert(std::is_integral<T>::value, "fun requires integral"); 
    ^~~~~~~~~~~~~ 

在一些或多或少遙遠的未來2020年或者你也可以使用concepts來實現這一點,如果你想要玩這個,在gcc中有一個實驗性的實現。

相關問題