2016-10-20 3 views
1

В C++ можно определить, указывает ли объект type_info указатель во время выполнения? Например,Как проверить, является ли typeid указателем во время выполнения?

char a1; 
char *a2; 

const std::type_info &ti1 = typeid(a1); 
const std::type_info &ti2 = typeid(a2); 

std::cout << is_pointer(ti1) << std::endl; 
std::cout << is_pointer(ti2) << std::endl; 

напечатает false для ti1 и true для ti2.

Очевидно, что можно было бы сделать std::is_pointer<decltype(a1)>::value, но для этого требуется, чтобы у нас был доступ к идентификатору переменной a1. Что делать, если у нас есть только доступ к его typeidti1?

+0

'ti1 == typeid (char *)'? – songyuanyao

+0

Он должен быть общим не специфичным для 'char'. – dzhelil

+0

Во всех практических сценариях это решение может (почти) всегда приниматься во время компиляции, я умираю, чтобы узнать прецедент. – gjha

ответ

3

typeid() дает вам std::type_info объект. Это все.

Как вы можете видеть в этой документации, type_info на самом деле не говорит вам многого. Практически все, что есть, есть «реализация определена».

И, там нет ничего, что говорит вам, авторитетно, является ли этот тип каким-то указателем.

«Определенная реализация» означает, что ваш компилятор C++ определяет, что это значит. Очень возможно, что если бы вы проконсультировались с документацией вашего компилятора, вы найдете некоторое дополнительное объяснение того, что возвращает name(), и вполне возможно определить тривиально, от name(), является ли этот тип указателем. Как и каким образом, полностью зависит от вашего компилятора и, конечно же, он будет полностью не переносимым.

Смежные вопросы