我已經使用(和見過使用)static_assert
到模板的參數值的標誌不期望的值。但是,對於我遇到的所有情況,通過SFINAE禁用這些不需要的值似乎更好,更優雅。例如何時使用`static_assert`而不是SFINAE?
template<typename T,
class = std::enable_if<std::is_floating_point<T>::value>::type>
struct Foo { ... };
,而不是
template<typename T>
struct Foo {
static_assert(std::is_floating_point<T>::value,
"Foo<T>: T must be floating point :-(");
...
};
所以我的問題:何時使用static_assert
,而不是SFINAE,爲什麼?
編輯
我想我已經學會了到目前爲止以下
SFINAE是一個靈活和強大,但可能非常複雜的工具,可用於多種任務,包括函數重載解析(有些似乎認爲它是唯一的目的)。
SFINAE可以以相對簡單的方式被使用過的位置static_assert
可以,不同之處在於它出現在聲明(類或函數的),而不是其定義(或是可以插入例如,將一個static_assert
轉換爲一個類的前向聲明?)。這使得更逐字,因此更明確的代碼。但是,由於SFINAE比較複雜,因此比簡單的static_assert
要難得多。
另一方面static_assert
有一個更清晰的編譯器錯誤消息的好處,有些人似乎認爲這是一個主要目的。
你能解釋爲什麼你認爲它是與SFINAE更好嗎? – 2012-08-16 10:02:01
也許我們的答案是以詞彙爲導向的。在你的問題中,我認爲你應該用'std :: enable_if'來代替SFINAE。使用強調事實不是錯誤的機制來產生錯誤聽起來很奇怪。 SFINAE =換人失敗不是一種錯誤 – log0 2012-08-17 12:18:54