1

次のように、is_pure_func_ptrという名前のトレイトチェッカーを作成します。これにより、タイプが純粋関数ポインターであるかどうかを判別できます。

#include <iostream>

using namespace std;

void f1()
{};

int f2(int)
{};

int f3(int, int)
{};

struct Functor
{
    void operator ()()
    {}
};

int main()
{
    cout << is_pure_func_ptr<decltype(f1)>::value << endl; // output true
    cout << is_pure_func_ptr<decltype(f2)>::value << endl; // output true
    cout << is_pure_func_ptr<decltype(f3)>::value << endl; // output true
    cout << is_pure_func_ptr<Functor>::value << endl;      // output false
    cout << is_pure_func_ptr<char*>::value << endl;        // output false
}

私の質問は:それをどのように実装するのですか?

4

2 に答える 2

4

Joachim Pileborgstd::is_functionが述べたように、仕事をします。それが選択肢ではなく、C++11 をサポートしている場合 (つまり、自分で実装する方法を知りたいだけであるか、標準ライブラリがまだ存在しない場合)、次のようにすることができます。

template<typename T>
struct is_pure_func_ptr: public std::false_type {};
template<typename Ret, typename... Args>
struct is_pure_func_ptr<Ret(Args...)>: public std::true_type {};//detecting functions themselves
template<typename Ret, typename... Args>
struct is_pure_func_ptr<Ret(*)(Args...)>: public std::true_type {};//detecting function pointers

これは機能しますが、異なる呼び出し規約や cv 修飾ポインターを持つ関数をサポートする場合は、追加の作業が必要になる場合があります。

于 2012-12-09T15:37:49.217 に答える
3

C++11 標準ライブラリがある場合は、 を試してくださいstd::is_function

于 2012-12-09T15:29:45.813 に答える