специализация шаблона для константного указателя на константный тип - PullRequest
4 голосов
/ 19 июля 2011

Я читал http://bartoszmilewski.wordpress.com/2009/10/21/what-does-haskell-have-to-do-with-c/ и наткнулся на этот код, чтобы проверить, является ли тип указателем или нет:

template<class T> struct
isPtr {
 static const bool value = false;
};

template<class U> struct
isPtr<U*> {
 static const bool value = true;
};

template<class U> struct
isPtr<U * const> {
 static const bool value = true;
};

Как мне специализировать общий шаблон для обработки регистра для константного указателя на константный тип? Если я сделаю это:

std::cout << isPtr <int const * const>::value << '\n';

Я получаю истину, когда ожидаю ложь. Может кто-нибудь объяснить?

РЕДАКТИРОВАТЬ: с помощью компилятора VC ++ 2010 (экспресс: -)

1 Ответ

5 голосов
/ 19 июля 2011

Результат только верный; ваша третья специализация вызывается, когда вы звоните isPtr <int const * const>; который вы устанавливаете на true.

В этом случае вы можете выбрать enum вместо bool, так как у вас есть 3 состояния:

enum TYPE
{
  NOT_POINTER,
  IS_POINTER,
  IS_CONST_POINTER
};

template<class T> struct
isPtr {
 static const TYPE value = NOT_POINTER;
};

template<class U> struct
isPtr<U*> {
 static const TYPE value = IS_POINTER;
};

template<class U> struct
isPtr<U * const> {
 static const TYPE value = IS_CONST_POINTER;
};

Вот демо .

...