自分の型を取得

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

もう少し簡単にできないか考え中。