Я создал систему тегов, которая позволяет использовать теги в движке ma. Он работает на основе типов C ++, поэтому каждый тег является типом (у меня есть причины).
Теперь, когда я хочу создать новый тег, мне нужно вызвать struct tagname{};
.
Если я хочу использовать тег в других файлах, я использую предварительное объявление struct name;
Чтобы сделать его более удобным для пользователя, я создал макросы
#define CREATE_TAG(name) struct name{};
#define USE_TAG(name) struct name;
Но когда пользователь вызывает один макрос внутри пространства имен, а другой - вне пространства имен, у меня возникает проблема, потому что это два разных типа.
Я хочу убедиться, что пользователь вызывает макросы вне любого пространства имен. Поскольку наш проект находится в одном пространстве имен namespace root
, я могу использовать его для проверки.
Вот что я до сих пор придумал:
namespace root
{
const unsigned TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE = 1;
};
#define CREATE_TAG(name) namespace root{ struct name{}; static_assert(root::TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE,""); }
#define USE_TAG(name) namespace root{ struct name; static_assert(root::TAGS_CAN_NOT_BE_DEFINED_INSIDE_ANY_NAMESPACE,""); }
Теперь, когда макрос используется вне корневого пространства имен, все в порядке. При вызове внутри корневого пространства имен или других вложенных пространств имен выдает ошибку TAGS_CAN_BE... not a member
.
Но мне это не очень нравится. Мне не нравится вся эта макроэкономика, но вопрос не в этом. Вопрос: есть ли лучший способ узнать, вызывается ли макрос в пространстве имен? Поскольку мои макросы передаются в Type, я могу использовать несколько типографий, но я не нашел ни одного подходящего.