1

次のタイプ:

std::remove_pointer<int(*)(int)>::type

ですint(int)。このコード:

#include <iostream>
#include <type_traits>

using namespace std;

int main()
{
   cout << boolalpha;
   cout << is_same<remove_pointer<int(*)(int)>, int(int)>::value;
   cout << endl;
}

「真」を出力します。しかし、「関数メンバー」の(書かれた)型は何ですか?

#include <iostream>
#include <type_trais>

using namespace std;

struct A {};

int main()
{
    cout << boolalpha;
    cout << is_same<remove_pointer<int(A::*)(int)>, int(int)>::value;
    cout << endl;
}

戻りますfalse。そしてint A::(int)、コンパイルエラー(無効なタイプ)をスローするようなものです。

4

2 に答える 2

3

これは次のようになります。非メンバー型は、オブジェクト型または関数型のいずれかです。

T = int;                 // object type
T = double(char, bool)   // function type

非静的クラスメンバーの場合、メンバーへのポインター型のみを持つことができます。それらは次の形式です。

class Foo;

PM = U Foo::*;           // pointer to member type

問題は何ですかU

U = int                 =>  PM = int Foo::*                  // pointer-to-member-object
U = double(char, bool)  =>  PM = double (Foo::*)(char, bool) // pointer-to-member-function

「メンバーへのポインター」はポインターではないため、そこから「ポインターを削除」することはできません。せいぜい、基になるタイプを取得できます。つまり、からPM = U Foo::*に移動できUます。私の知る限り、そのような特性は存在しませんが、簡単に作成できます。

template <typename> struct remove_member_pointer;

template <typename U, typename F> struct remove_member_pointer<U F::*>
{
    typedef U member_type; 
    typedef F class_type;
};
于 2013-01-25T15:16:10.830 に答える
3

メンバーへのポインターはポインターではありません。

remove_pointerタイプを変更しません。

于 2013-01-25T15:10:37.493 に答える