Разборка define

311
04 июня 2017, 20:50

Не могли бы вы мне прокомментировать каждое действия этого кода?

#define DEF_TYPENAME(type) template <> \ struct NameOf<type> {\
static const char value[];\ };\

Как я понимаю:

#define имя_макроса последовательность_символов = #define DEF_TYPENAME(type) template <>

Более подробный код:

#include <iostream>
template <typename T>
struct NameOf {};
#define DEF_TYPENAME(type) template <> \
struct NameOf<type> {\
    static const char value[];\
};\
const char NameOf<type>::value[] = #type;
DEF_TYPENAME(int)
DEF_TYPENAME(double)
DEF_TYPENAME(long double)
DEF_TYPENAME(float)
DEF_TYPENAME(char)
DEF_TYPENAME(long)
DEF_TYPENAME(unsigned)
DEF_TYPENAME(unsigned long)
template <typename T, typename ...types>
void printTypes(T)
{
    std::cout << NameOf<T>::value << std::endl;
}
template <typename T, typename ...types>
void printTypes(T, types... t)
{
    std::cout << NameOf<T>::value << ", ";
    printTypes(t...);
}
int main(int argc, char *argv[])
{
    printTypes(1,2U,3L, 4.0, 5.0L, 6UL, 'a', 8.0F);
}
Answer 1

#define -- обычная замена. Каждый раз, когда препроцессор ви дит запись DEF_TYPENAME(type) он заменяет её на

template <> // NameOf -- шаблонная структура, но полность специализруется тут
struct NameOf<type> {
    static const char value[];
};
const char NameOf<type>::value[] = #type;

То есть специализирует структуру NameOf для типа type. Задавая внутри структуры одну статическую переменную. Дальше идёт инициализация статической переменной. Почему она происходит именно так, и что такое статический член класса можно прочитать тут. #type превратит переданную значение в строку и именно этой строкой будет инициализирована статическая переменная класса.
То есть в результате вызова DEF_TYPENAME(int) мы специализируем структуру NameOf и в статическую переменную NameOf<int>::value запишем строчку "int".

Answer 2

Каждое упоминание DEF_TYPENAME(T) разворачивается в создание типа со строковым членом данных, в который попадает переданное имя T. Далее функцией printTypes выводятся типы переданных аргументов, связанные через инстанцированный ранее шаблонный тип.

READ ALSO
Прижать форму к правому нижнему углу другой формы (С++ XE5)

Прижать форму к правому нижнему углу другой формы (С++ XE5)

Есть "дочерняя" форма, которая создается внутри другой "главной" формыПосле создания ей сразу прописывается:

279
С++ и драйвер смартфона

С++ и драйвер смартфона

Как работать с драйвером смартфона? Надо устанавливать апк, копировать файлы оттуда и все такоеДа, ADB это все умеет, но не вижу смысла дергать...

296
Что означает запись &gt;&gt; или &lt;&lt; в коде

Что означает запись >> или << в коде

К примеру есть участки кода, подобные этим:

399
Set, Multiset, Map, Multimap

Set, Multiset, Map, Multimap

В чем разница между ними и примеры, если можно

357