2016-04-13 20 views
3

私は何かが関数であるかどうかを検出するために次の操作を行うことができますか?メンバー関数のstd :: is_function?今</p> <pre><code>void f() { } int main() { std :: cout << std :: is_function <decltype(f)> :: value << std :: endl; // true } </code></pre> <p>、私は同じことを行いたい場合は何が起こるが、クラスのメソッドである機能を:

私は単純に

class myclass 
{ 
public: 
    void f() 
    { 
    } 
}; 

int main() 
{ 
    std :: cout << std :: is_function <decltype(myclass :: f)> :: value << std :: endl; 
} 

ような何かをしようとした。しかし、私は私が行うことになっています何

Call to non-static member function without an object argument 

を取得しますか?私は上記のようなものが好きです。ちょうどtrueを印刷してください。

+4

本当に余分な間隔です。 – Barry

答えて

4

メンバ関数ポインタは、通常の関数ポインタと同じではありません。また、myclass::fは、&がないと正しく形成されません。メンバ関数の場合は、std::is_member_function_pointerが存在します。

#include <iostream> 
#include <type_traits> 

class myclass 
{ 
public: 
    void f() {} 
}; 

int main() 
{ 
    std::cout << std::is_member_function_pointer<decltype(&myclass::f)>::value << std::endl; 
} 

Live on ideone

1

あなたはアドレスを渡す必要がある - それはメンバ関数へのポインタにする必要があります - ので、エラー

decltype(&myclass::f) 

そうでない場合、構文は静的関数を参照して解析します。ただし、&myclass::fは機能ではありません。それを呼び出すことはできません(std::is_functionfalseを返します)。

2

decltype(myclass :: f)悪い形成されています。

std::is_member_function_pointerstd::is_member_function_pointer<decltype(&myclass::f)>::value)を使用できます。

興味深いのは、std::is_functionを活かしstd::is_member_function_pointerの可能な実装である:コンパイルエラーを引き起こす、

template< class T > 
struct is_member_function_pointer_helper : std::false_type {}; 

template< class T, class U> 
struct is_member_function_pointer_helper<T U::*> : std::is_function<T> {}; 

template< class T > 
struct is_member_function_pointer : is_member_function_pointer_helper< 
            typename std::remove_cv<T>::type 
            > {}; 
0

myclass::fは、関数呼び出しであることを想定しているが、引数が提供されていません。

あなたは、このような&myclass::fとして、メンバ関数のアドレスを取得するためにoperator&を使用することができますが、それは、メンバ関数ポインタだ、std::is_functionfalseを返します。

Tが関数型かどうかを確認します。 std :: function、lambdas、オーバーロードされたoperator()や関数へのポインタを持つクラスのような型は、関数型としてカウントされません。

std::is_member_function_pointerを使用して、非静的メンバー関数ポインタかどうかを確認できます。

関連する問題