У меня есть система признаков типа, которая находится в пространстве имен, например:
namespace my_namespace
{
template <typename T>
struct magic_traits
{
static const int value = 0;
};
}
Поскольку люди ненавидят синтаксис специализированных шаблонов, у меня есть этот удобный маленький макрос:
#define DECLARE_MY_MAGIC_TRAITS(type_, value_) \
namespace my_namespace \
{ \
template <> \
struct magic_traits<type_ > { \
static const int value = value_; \
}; \
}
}
Моя проблема в том, что это работает только для объявлений, сделанных в глобальном пространстве имен, поэтому черты для типа в другом пространстве имен выглядят следующим образом:
DECLARE_MAGIC_TRAITS(other_namespace::some_type, 9)
Хорошо, если люди знают обо всех правилах пространства имен, где находится DECLARE_MAGIC_TRAITS
. Если они этого не делают и помещают декларацию в собственное пространство имен, они получат такие ошибки, как:
'magic_traits' is not a template!
Specialization of non-template 'other_namespace::my_namespace::magic_traits'
Это довольно запутанно для нового пользователя вашей библиотеки!
Есть ли способ сделать этот макрос способным определить специализацию magic_traits
из любого места? Если это невозможно (как я подозреваю): Какие методы могут быть использованы для генерации более разумных сообщений об ошибках?
Я должен отметить, что мои пользователи в основном являются программистами на Python и имеют очень мало опыта на С++, поэтому все, что я могу сделать, чтобы сделать их жизнь проще, тем лучше.