Не могли бы вы мне прокомментировать каждое действия этого кода?
#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);
}
#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".
Каждое упоминание DEF_TYPENAME(T) разворачивается в создание типа со строковым членом данных, в который попадает переданное имя T. Далее функцией printTypes выводятся типы переданных аргументов, связанные через инстанцированный ранее шаблонный тип.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости