Мне интересно, как эта штука работает над теорией.
Пример:
#include <boost/type_traits/is_enum.hpp>
#include <iostream>
enum foo
{
AAA,
BBB
};
typedef foo bar;
struct sfoo {
enum bar {
CCC
};
};
int main()
{
std::cout << boost::is_enum<foo>::value << "\n"; // 1
std::cout << boost::is_enum<bar>::value << "\n"; // 1
std::cout << boost::is_enum<sfoo>::value << "\n"; // 0
std::cout << boost::is_enum<int>::value << "\n"; // 0
std::cout << boost::is_enum<sfoo::bar>::value << "\n"; // 1
return 0;
}
Я пытаюсь изучить исходный код, но это было слишком сложно (навигация по коду макросов + шаблоны не удалась). Кто-то может получить теорию исследования, как это работает? Я понятия не имею, как это можно реализовать.
Вы работаете с большим количеством макросов, потому что Boost переключается между встроенными функциями компилятора для всех платформ, которые он поддерживает. Например, Visual C ++ определяет __is_enum(T)
который вернется true
если T
является enum
а также false
иначе. MSDN имеет список таких встроенных функций, которые Visual C ++ реализует для поддержки черт типа.
is_enum
в настоящее время является частью C ++ 11 и включен в type_traits
заголовок. Просмотр стандартной реализации библиотеки, скорее всего, будет проще, чем заголовки Boost.
РЕДАКТИРОВАТЬ:
Я нашел реализацию Boost; это находится в <boost_path>\boost\type_traits\intrinsics.hpp
, Искать этот файл для BOOST_IS_ENUM
в этом файле вы увидите встроенную функцию компилятора, реализованную различными компиляторами. Интересно, что все они реализуют этот конкретный __is_enum(T)
,
boost::is_enum
реализован как std::is_enum
, Это требует некоторого волшебства компилятора. Проверьте следующую ссылку, которая имеет тот же вопрос и реализацию: реализация is_enum
Я не следовал за кодом Boost в деталях, но, похоже, он использует простое исключение: перечисление — это нечто не арифметическое (встроенные целые числа и типы с плавающей точкой и указатели), а не ссылка, не функция, не класс или объединение, а не массив.