2017-01-10 35 views
6

Napisałem funkcję szablonu, która przyjmuje dowolną liczbę typów i wyświetla ich rozmiary dla podstawowej architektury i systemu operacyjnego. Jednak funkcja nie jest w stanie odróżnić aliasu od typu rzeczywistego, więc jest oceniana tak, jakby była typu rzeczywistego.Różnicowanie aliasu i prawdziwych typów podczas kompilacji?

Mimo to chcę mieć możliwość rozróżnienia aliasu i typu wbudowanego w czasie kompilacji i na przemian dane wyjściowe na jego podstawie.

func<unsigned int, size_t>(); 

wyjściowa:

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

Jednakże chcę wyjście tak być,

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

Oczywiście to wymaga kompilatora, aby móc odróżnić alias i wbudowany wpisz w czasie kompilacji.

Czy istnieje sposób na odróżnienie prawdziwego typu i aliasu w czasie kompilacji w dowolnej wersji C++?

+2

Co za miłe pytanie od nowego użytkownika! – Bathsheba

Odpowiedz

6

Odpowiedź brzmi, że nie można tego zrobić teraz. Istnieje jednak propozycja odbicia statycznego: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html

W tym dokumencie wymieniono Operation get_base_name, który zwróci nazwę typu. Jednak stwierdzenie, że:

get_base_name powoływać na meta :: Alias ​​zwraca nazwę aliasu, nie nazwa aliasing deklaracji.

Następnie zapewnić Operation get_aliased, które mogą być stosowane w celu uzyskania pierwotnej typu alias stosowany z get_base_name.

Przykładowy kod z dokumentu:

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; 

daje następujący wynik:

5:rank_t; 
6:int; 

Bonus: Jeśli masz zainteresowanie próbuje to teraz, poniższy dokument, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0385r1.pdf, wspomina o początkowej eksperymentalnej implementacji na widelcu klina na GitHub tutaj: https://github.com/matus-chochlik/clang/tree/reflexpr.

6

Nie masz szczęścia.

Niestety, nie ma możliwości rozróżnienia w czasie kompilacji lub czasu wykonywania, jeśli typ jest typem pierwotnym lub typem typu pierwotnego.

+0

Odpowiedzi w ten sposób sprawiają, że chcę to zrobić. Zasadniczo można oszukiwać i używać preprocesora. Utrzymanie tabeli nazw kanonicznych. Jeśli użyty token nie pasuje do nazwy kanonicznej, będziesz wiedział, że jest to alias. Ale gdybym to zrobił, ktoś mógłby go użyć i poczułbym się okropnie. – Yakk

+1

@Tak znowu nie ... – Quentin