爲了您的信息,編譯時故障通常防止編譯...這就是爲什麼他們在這裏畢竟。
我能想到的兩種方式,做你所建議的:
SFINAE
從字面上看,SFINAE是指: 替代失敗不是錯誤。它適用於模板上下文,並允許證明不足以從過載集合中安靜地丟棄的函數。 SFINAE的使用引發了概念檢查和用於支持這些檢查的性狀的屬性分類。
在你的情況,這意味着,如果你能以某種方式把表達你想在其中SFINAE可以申請,那麼你可以嘗試,並檢測出特定的功能得到了有效的丟棄的情況下進行測試。
例如:
#include <iostream>
#include <utility>
struct Foo {};
struct Bar {};
template <typename T>
auto foo(T t) -> decltype(std::declval<Foo>() + t) { std::cout << "T\n"; }
void foo(...) { std::cout << "ellipsis\n"; }
int main() { foo(Bar()); }
收率:
ellipsis
(見ideone),即使沒有任何地方所定義operator+(Foo, Bar)
。
不幸的是,這可能不是所有的情況下工作,(不確定尚未),但它應該是對所有標準的編譯器便攜。
編譯特定
另一種可能性是使用編譯器的特定功能。編譯器測試套件必須確認這些編譯器正確地診斷錯誤,你的情況做當static_assert
條件滿足時發出錯誤。因此編譯器可能有這個鉤子。
例如,在鏘測試套件一個可以找到一個SemaCXX/static-assert.cpp
文件:
// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++0x
int f();
static_assert(f(), "f"); // expected-error {{static_assert expression is not an integral constant expression}}
static_assert(true, "true is not false");
static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}}
void g() {
static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}}
}
class C {
static_assert(false, "false is false"); // expected-error {{static_assert failed "false is false"}}
};
template<int N> struct T {
static_assert(N == 2, "N is not 2!"); // expected-error {{static_assert failed "N is not 2!"}}
};
T<1> t1; // expected-note {{in instantiation of template class 'T<1>' requested here}}
T<2> t2;
template<typename T> struct S {
static_assert(sizeof(T) > sizeof(char), "Type not big enough!"); // expected-error {{static_assert failed "Type not big enough!"}}
};
S<char> s1; // expected-note {{in instantiation of template class 'S<char>' requested here}}
S<int> s2;
的-fsyntax-only
避免代碼生成和-verify
意味着,編譯器檢查該expected-note
,expected-warning
和指定expected-error
正確滿足。
如果它們不是,那麼編譯器將返回一個錯誤代碼。當然,這很可能是編譯器特有的。
您是否試圖通過嘗試傳遞完全不相關的'Foo'參數來測試只接受'Bar'參數的函數。 static_assert是一個編譯時構造,因此您不需要測試該約束? – 2012-01-15 14:40:15
@parapura rajkumar,你是對的。單元測試只證明它是類型安全的 - 我想捕獲static_assert失敗並將它們提升到更高的級別。我希望儘可能接近開發代碼的static_assert失敗,因此編譯錯誤更相關。 – 2012-01-15 14:53:41
@mister爲什麼你不需要相信你的用戶知道他們在某些時候編碼了什麼? – 2012-01-15 16:14:17