GCC の __PRETTY_FUNCTION__ 識別子
C++11 では __func__
という識別子が追加され、関数名が文字列で取得する事が出来ます。
#include <iostream> namespace my{ template<typename T, typename U> auto plus(T a, U b){ // 現在の関数の名前を取得できる std::cout << __func__ << std::endl; return a + b; } } int main(){ std::cout << my::plus(1, 2) << std::endl; return 0; } /* output: plus 3 */
GCC の __PRETTY_FUNCTION__
識別子
__func__
識別子では『関数の名前』しか取得出来ません。
しかし、GCC の言語拡張である __PRETTY_FUNCTION__
を使用すると更に詳細な値を取得する事が出来ます。
#include <iostream> namespace my{ template<typename T, typename U> auto plus(T a, U b){ std::cout << __func__ << std::endl; std::cout << __PRETTY_FUNCTION__ << std::endl; return a + b; } } int main(){ std::cout << my::plus(1, 2) << std::endl; std::cout << my::plus(3.14, 2.1) << std::endl; return 0; } /* output: auto my::plus(T, U) [T = int, U = int] 3 auto my::plus(T, U) [T = double, U = double] 5.24 */
こんな感じでテンプレート引数なんかも出力してくれるのでデバッグする時に便利そう。
ただし、コンパイラ依存なので使用する場合は注意する必要があります。