這樣就很清楚了,我在建立一個斷言(assertion)。Can_copy模板可以這樣定義:
template<class T1, class T2> struct Can_copy {
static void constraints(T1 a, T2 b) { T2 c = a; b = a; }
Can_copy() { void(*p)(T1,T2) = constraints; }
};
Can_copy(在運行時)檢查T1是否可以被賦值給T2。Can_copy<T,Shape*>檢查T是否是Shape*類型,或者是一個指向由Shape類公共繼承而來的類的對象的指針,或者是被用戶轉換到Shape*類型的某個類型。注意這個定義被精簡到了最。
一行命名要檢查的約束,和要檢查的類型
一行列出指定的要檢查的約束(constraints()函數)
一行提供觸發檢查的方法(通過構造函數)
注意這個定義有相當合理的性質:
你可以表達一個約束,而不用聲明或復制變量,因此約束的編寫者可以用不著去設想變量如何被初始化,對象是否能夠被復制,被銷毀,以及諸如此類的事情。(當然,約束要檢查這些屬性的情況時例外。)
使用現在的編譯器,不需要為約束產生代碼
定義和使用約束,不需要使用宏
當約束失敗時,編譯器會給出可接受的錯誤信息,包括“constraints”這個詞(給用戶一個線索),約束的名字,以及導致約束失敗的詳細錯誤(例如“無法用double*初始化Shape*”)。
那么,在C++語言中,有沒有類似于Can_copy——或者更好——的東西呢?在《C++語言的設計和演變》中,對于在C++中實現這種通用約束的困難進行了分析。從那以來,出現了很多方法,來讓約束類變得更加容易編寫,同時仍然能觸發良好的錯誤信息。例如,我信任我在Can_copy中使用的函數指針的方式,它源自Alex Stepanov和Jeremy Siek。我并不認為Can_copy()已經可以標準化了——它需要更多的使用。同樣,在C++社區中,各種不同的約束方式被使用;到底是哪一種約束模板在廣泛的使用中被證明是最有效的,還沒有達成一致的意見。
文章來源于領測軟件測試網 http://www.kjueaiud.com/