如何确定参数是否是纯函数指针?

时间:2012-12-09 15:26:31

标签: c++ function function-pointers functor typetraits

我想编写一个名为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
}

我的问题是:如何实施?

2 个答案:

答案 0 :(得分:4)

如Joachim Pileborg所述,std::is_function将完成这项工作。 如果这不适合您,但您确实拥有C ++ 11支持(意味着您只想知道如何自己实现它或者您的标准库还没有),您可以这样做:< / p>

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

This works,但在支持具有不同调用约定和/或cv限定指针的函数时,您可能还需要额外的工作

答案 1 :(得分:3)

如果您有C ++ 11标准库,请尝试std::is_function