使用C++模板進行元編程時,是否有一種方法可以像調試器那樣使用,以便逐步瞭解如何實例化和編譯模板?現在看來,在創建一個複雜的模板網絡時,除了查看編譯器錯誤消息以查看如何實例化模板(如果存在任何編譯器錯誤),實際上並沒有很好的調試方法,並嘗試從錯誤消息中反向工作,如果出現意想不到的情況。我不確定是否存在我正在尋找的東西,因爲它必須是在編譯時完成的東西,但基本上它會是一種方法,有點像遍歷代碼並檢查堆棧框架gdb
在運行時,其中可以停止編譯器,並且環境檢查模板或嵌套模板集實例化的順序。調試模板實例化
舉例來說,假設我創建了一些簡單的代碼如下所示:
template<typename T, typename R = void>
struct int_return_type {};
template<typename R>
struct int_return_type<int, R>
{
typedef R type;
};
template<typename T, typename R = void>
struct float_return_type {};
template<typename R>
struct float_return_type<float, R>
{
typedef R type;
};
template<typename T>
typename int_return_type<T>::type test()
{
cout << "T type is int" << endl;
}
template<typename T>
typename float_return_type<T>::type test()
{
cout << "T type is float" << endl;
}
int main()
{
test<int>();
test<float>();
return 0;
}
我知道這是比較容易的代碼跟隨,但這樣做的元編程時,模板可以更多地參與了不少,尤其是,遞歸等等。我知道編譯器會發出錯誤消息,可以用來推斷如何實例化模板,但是我也想知道當實際模板代碼在句法意義上是正確的時候可以做什麼,但是運行時結果仍然不正確。例如,有一種方法可以停止編譯器,並查看test
以及int_return_type
和float_return_type
正在被實例化或哪些實例失敗。
是目前唯一可用於調試具有此粒度級別的模板的代碼1)代碼不正確時的編譯器錯誤消息,以及2)反彙編程序和調試程序的組合以查看運行時生成的實例化代碼時間結果不正確?還是有其他一些實用工具可以幫助「觀察」模板的實例化,並查看/檢查編譯器生成什麼代碼來調查和調試模板錯誤?
除'static_assert'以外,你想要觀察錯誤的東西我不認爲有什麼可以幫助 – Flexo