C++にはクラス内で自分の型を取得する直接的な方法がないという問題があり、そのためにtypedef X this_type;のようなことが行われていました。
C++11にはdecltypeがあるので、decltype(*this);で自分の型を取得できます。
ただし、decltype(*this)で導出される型はXではなくX&のため、std::remove_referenceしないといけないのであまり便利ではないのでした。
#include <iostream> #include <type_traits> struct X { void foo() { // decltype(*this)::bar(); // エラー!X&::bar()はできない std::remove_reference<decltype(*this)>::type::bar(); } static void bar() { std::cout << "bar" << std::endl; } }; int main() { X().foo(); }
bar
remove_referenceを使いたくない場合のとりあえずの簡略方法としては、std::declval()のコピー版を書くことでしょうか。
#include <iostream> template <class T> T declcopy(T&); // 宣言のみ struct X { void foo() { decltype(declcopy(*this))::bar(); } static void bar() { std::cout << "bar" << std::endl; } }; int main() { X().foo(); }
bar
もう少し簡単にできないか考え中。