2017-01-10 7 views
6

Я написал функцию шаблона, которая принимает произвольное количество типов и отображает их размеры для базовой архитектуры и операционной системы. Однако функция не может отличать псевдоним от реального типа, поэтому его оценивают так, как будто она является реальным.Дифференцирование псевдонима и реальных типов во время компиляции?

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

func<unsigned int, size_t>(); 

Выход:

Unsigned int is 4 bytes. 
Unsigned int is 4 bytes. 

Однако я хочу выход быть похожим,

Unsigned int is 4 bytes. 
size_t is an alias for unsigned int. 

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

Итак, существует ли способ дифференцирования реального типа и псевдонима во время компиляции в любой версии на C++?

+2

Какой хороший вопрос от нового пользователя! – Bathsheba

ответ

6

Ответ заключается в том, что вы не можете это сделать сейчас. Однако есть предложение для статического отражения: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html

В этом документе упоминается Operation get_base_name, который вернет название типа. Однако они заявляют:

get_base_name вызывается мета :: Псевдоним возвращает имя псевдонима, а не от имени совмещенной декларации.

Они затем предоставить Operation get_aliased, которые могут быть использованы для получения оригинального вида псевдонима, когда используется с get_base_name.

Пример кода из документа:

using rank_t = int; 

using mR = reflexpr(rank_t); 
cout << "5:" << get_base_name_v<mR> << endl; 
cout << "6:" << get_base_name_v<get_aliased_m<mR>> << endl; 

производит следующий вывод:

5:rank_t; 
6:int; 

Бонус: Если у вас есть интерес попробовать это сейчас, следующий документ, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0385r1.pdf, упоминает, что на GitHub есть начальная экспериментальная реализация на вилке clang: https://github.com/matus-chochlik/clang/tree/reflexpr.

6

Вам не повезло.

К сожалению, нет никакого способа выделить во время компиляции или времени выполнения, если тип является примитивным типом, или typedef примитивного типа.

+0

Ответы, подобные этому, заставляют меня хотеть на самом деле это сделать. В принципе, вы обманываете и используете препроцессор. Ведите таблицу канонических имен. Если используемый токен не соответствует каноническому имени, вы знаете, что это псевдоним. Но если бы я это сделал, кто-то мог на самом деле использовать его, и я бы чувствовал себя нехорошим. – Yakk

+1

@Yakk не снова ... – Quentin

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

  • Нет связанных вопросов^_^