コンパイル時に型名を出力する

boost::mpl::print を使用すれば、コンパイル時に警告メッセージとして、型名を間接的に出力することが出来ます。


[ソース]

#include <boost/mpl/print.hpp>
#include <utility>

template<typename T>
void
func(T){
    typedef typename boost::mpl::print<T>::type hoge;
}

int main(){
    typedef boost::mpl::print<int>::type hoge;
    func([]()->int{ return 0; });
    func(std::make_pair(0.0f, 10));
}


[msvc のコンパイル時メッセージ]

1>------ ビルド開始: プロジェクト: test, 構成: Debug Win32 ------
1>  test.cpp
1>D:\home\work\software\lib\cpp\boost\boost_1_46_1\boost/mpl/print.hpp(51): warning C4308: 負の整数定数が符号なしの型に変換されました。
1>          test.cpp(12) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::mpl::print' の参照を確認してください
1>          with
1>          [
1>              T=int
1>          ]
1>D:\home\work\software\lib\cpp\boost\boost_1_46_1\boost/mpl/print.hpp(51): warning C4308: 負の整数定数が符号なしの型に変換されました。
1>          test.cpp(8) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::mpl::print' の参照を確認してください
1>          with
1>          [
1>              T=`anonymous-namespace'::
1>          ]
1>          test.cpp(13) : コンパイルされたクラスの テンプレート のインスタンス化 'void func<`anonymous-namespace'::>(T)' の参照を確認してください
1>          with
1>          [
1>              T=`anonymous-namespace'::
1>          ]
1>D:\home\work\software\lib\cpp\boost\boost_1_46_1\boost/mpl/print.hpp(51): warning C4308: 負の整数定数が符号なしの型に変換されました。
1>          test.cpp(8) : コンパイルされたクラスの テンプレート のインスタンス化 'boost::mpl::print' の参照を確認してください
1>          with
1>          [
1>              T=std::pair
1>          ]
1>          test.cpp(14) : コンパイルされたクラスの テンプレート のインスタンス化 'void func>(T)' の参照を確認してください
1>          with
1>          [
1>              _Ty1=float,
1>              _Ty2=int,
1>              T=std::pair
1>          ]
1>  test.vcxproj -> D:\06010080\home\work\software\test\cpp\test\Debug\test.exe
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========

これでかなり template を使用した場合のデバッグが楽になります。
あとアンドキュメントなので、もしかしたら使い方が間違っているかも知れません。

[環境]

  • boost 1.46.1
  • msvc 2010