У меня есть система черт типов, которая находится в пространстве имен, например:
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 и очень мало имеют опыта работы с C ++, поэтому все, что я могу сделать, чтобы облегчить их жизнь, будет лучше.