is_function_pointer&LT;&GT; for <type_traits> </type_traits>

时间:2011-07-03 01:38:51

标签: c++ visual-studio visual-studio-2010 visual-c++ c++11

<type_traits>中有以下内容:

is_pointer<>
is_function<>
is_member_function_pointer<>

但不是这样:

is_function_pointer<>

为什么会这样?

2 个答案:

答案 0 :(得分:11)

[meta.unary.cat]中的特征旨在将每种类型分类为单个类别。它是一个void,整数,指针等。在这个级别,指向函数的指针与指向int的指针没有什么不同。请注意,指向成员的指针不是指针。它只是一个英语同音词。

意图是每个类型在[meta.unary.cat]中只返回一个特征。在这种分类中,函数指针和标量指针都会在is_pointer下返回true。

我会注意到我们没有实现目标。 nullptr_t逃脱了我们的目标。但我们接近了。 Here是当前type_traits分类的图形表示。

<强>更新

这是一个正确工作的程序,输出正确:

#include <iostream>
#include <type_traits>

typedef void (*fptr)();
typedef int* intptr;

int main()
{
    std::cout << std::is_function<fptr>::value << '\n';
    std::cout << std::is_pointer<fptr>::value << '\n';
    std::cout << std::is_pointer<intptr>::value << '\n';
}

0
1
1

答案 1 :(得分:6)

这似乎是一个奇怪的疏忽。但是,成员指针始终是成员指针类型,与自由函数不同,自由函数可以是指针类型(void(*)())或函数类型(void())。此外,std::is_pointer永远不会为成员指针类型返回true。

但是,如果您需要此功能,请参阅以下内容:

template<typename testType>
struct is_function_pointer
{
    static const bool value =
        std::is_pointer<testType>::value ?
        std::is_function<typename std::remove_pointer<testType>::type>::value :
        false;
};