Проверьте во время компиляции, является ли тип указателем - PullRequest
4 голосов
/ 08 января 2012

Я пытаюсь найти способ определить, является ли тип указателем во время компиляции. Это примерно так:

#include <type_traits>
#if std::is_pointer<char*>::value
#pragma message("blah")
#endif

Однако это выдает предупреждение C4067: неожиданные токены следуют за препроцессоромдиректива - ожидал новой строки "дважды (я думаю, что :: это то, что смущает это), и он не печатает бла. Когда я hoover over :: value, компилятор говорит мне, если это правда, что означает, что это известно во время компиляции, так чтодолжно работать.

Причина этого в том, что я хочу иметь возможность сделать что-то вроде этого:

T pHead;
#if std::is_pointer<T>::value
pHead= NULL;
#endif

, где я NULL переменная, если это указатель. Это должно бытьпроверка времени компиляции, потому что если T является структурой, я не могу присвоить NULL ее переменной. Т.е. следующий код не будет компилироваться, когда T является структурой:

T pHead;
if (std::is_pointer<T>::value)
    pHead= NULL;

Спасибо
Matt

Ответы [ 2 ]

4 голосов
/ 08 января 2012

Вы можете инициализировать переменную значением по умолчанию, равным NULL для типа указателя.

T pHead = T();

Работает также и для большинства структур.

3 голосов
/ 08 января 2012

Для этого можно использовать шаблоны:

template<typename A>
void foo(A a)
{

}

template<typename A>
void foo(A*& a)
{
   a = NULL;
}

Вызов foo с типом указателя войдет во вторую функцию, иначе в первую.

Вы не можете сделать это с препроцессоромдирективы, потому что, как следует из названия, это происходит до компиляции.

Но разрешение шаблона происходит во время компиляции, поэтому вы можете использовать это решение.

Я предполагаю, что вы уже используете шаблонытак как ваш код также предоставляет общий тип:

T pHead;
#if std::is_pointer<T>::value
pHead= NULL;
#endif

, вы можете использовать

T pHead;
foo(pHead);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...