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