Идиоматические черты типа C ++

У меня есть система черт типов, которая находится в пространстве имен, например:

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

11
задан Travis Gockel 4 July 2011 в 15:05
поделиться