is_function_pointer <> для - PullRequest
       14

is_function_pointer <> для

10 голосов
/ 03 июля 2011

Есть такие в <type_traits>:

is_pointer<>
is_function<>
is_member_function_pointer<>

Но не это:

is_function_pointer<>

Почему это так?

Ответы [ 2 ]

11 голосов
/ 03 июля 2011

Черты в [meta.unary.cat] предназначены для классификации каждого типа в одну категорию.Является ли это пустым, целочисленным, указателем и т. Д. На этом уровне указатель на функцию ничем не отличается от указателя на int.И обратите внимание, что указатель на член не является указателем.Это просто английский омоним.

Предполагалось, что каждый тип возвращает true только для одной черты в [meta.unary.cat].И в этой классификации и указатель функции, и указатель скаляра будут возвращать значение true при is_pointer.

. Я отмечу, что мы не достигли нашей цели.nullptr_t ускользает от нашей цели.Но мы подошли близко. Здесь - графическое представление текущей классификации 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
6 голосов
/ 03 июля 2011

Это кажется странным упущением. Однако указатели на члены всегда являются типами указателей на члены, в отличие от свободных функций, которые могут быть либо указателями типов (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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...