Возможно ли, чтобы объявление выходило из окружающего пространства имен?

Я пытаюсь написать макрос, который помогает в создании enum class с различными вспомогательными функциями, например, для преобразования в строку. Было бы естественно предоставить доступ ко всем значениям перечисления в некоторой коллекции:

DEFINE_ENUM(Foo, Value1, Value2);

for (Foo v : enum_traits<Foo>::all_values) {
    // ...
}

Похоже, что этого можно добиться, сделав макрос DEFINE_ENUM() специализированным для общего enum_traits класс:

// globally:
template<typename T> struct enum_traits {};

// inside the macro:
#define DEFINE_ENUM(Name, ...) \
    /* define "enum class Name" ... */ \
    template<> struct my_enum_traits<Name> { \
        /* define all_values member */ \
    };

Однако, если расширение DEFINE_ENUM(Foo, Value1, Value2); происходит внутри пространства имен, то для него кажется невозможным специализировать шаблон вне этого пространства имен.

template<typename T> struct enum_traits {};

namespace foo {
    // imagine DEFINE_ENUM is invoked here:

    enum class Foo { Value1, Value2 };

    // error: class template specialization of 'enum_traits'
    //   must occur at global scope
    template<> struct ::enum_traits<Foo> { /* ... */ };
}

Есть ли способ достичь этого, т. е. чтобы макрос "экранировал" пространство имен, включающее его вызов, и специализировал шаблон из другого пространства имен (даже глобального пространства имен)?

4 голоса | спросил jtbandes 24 AMpTue, 24 Apr 2018 02:37:56 +030037Tuesday 2018, 02:37:56

1 ответ


0
Ну, я не могу напрямую помочь в этой проблеме специализации шаблона черт, я подозреваю, что это невозможно.Но с ADL можно достичь своей настоящей целиСмотрите трюк:Хитрость заключается в определении функции ---- +: = 1 =: + ---- в пространстве имен ---- +: = 2 =: + ---- .Эта функция должна иметь тип возвращаемого значения - тип, который должен соответствовать вашим чертам.Эта функция не нуждается в реализации - это только ADL способ получить тип из пространства имен вновь определенного типа перечисления.Некоторое демо, что это действительно работает.
ответил PiotrNycz 24 AMpTue, 24 Apr 2018 03:08:49 +030008Tuesday 2018, 03:08:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132