Можно ли разрешить тип шаблона в фиксированном пространстве имен? - PullRequest
0 голосов
/ 07 ноября 2018

Дан следующий тип:

struct Object {
    using NestedAlias = bool;
};

namespace Hidden {
    struct Object {
        using NestedAlias = bool;
    };
}

Я понимаю, что тип может быть разрешен из пространства имен шаблона.

template <typename Type>
void legal(Type type) {
    using Alias = typename Type::NestedAlias;
}

legal(Object{});

Однако мне не удалось разрешить, когда тип шаблона находится справа от оператора разрешения, а левая часть является пространством имен. Возможно ли это?

template <typename Type>
void illegal(Type type) {
    using Alias = Hidden::Type;
    using Alias = Hidden::decltype(Type);
    using Alias = typename Hidden::Type;
    using Alias = typename Hidden::decltype(Type);
}

Для тех, кому интересно, каков вариант использования:

template <typename Type>
void double_object_use_case(Type type) {
    Hidden::Type hidden_type;
    operation_on_both_types(type, hidden_type);
}

Годболт-ссылка для игры: https://godbolt.org/z/LRNK0b

1 Ответ

0 голосов
/ 07 ноября 2018

Шаблон не работает с именем , но с типом (или значением).

В настоящее время единственный способ играть с именами - это MACRO.

Альтернативой является добавление скрытого типа в качестве псевдонима:

  • В классе:

    namespace Hidden {
        struct Object {
            using NestedAlias = bool;
        };
    }
    
    struct Object {
        using NestedAlias = bool;
    
        using Hidden = Hidden::Object;
    };
    
    template <typename Type>
    void double_object_use_case(Type type) {
        typename Type::Hidden hidden_type;
        operation_on_both_types(type, hidden_type);
    }
    
  • в качестве черт:

    struct Object {
        using NestedAlias = bool;
    };
    
    namespace Hidden {
        template <typename> struct Traits;
    
        template <>
        Traits<Object> {
            using NestedAlias = bool;
        };
    }
    
    template <typename Type>
    void double_object_use_case(Type type) {
        typename Hidden::Traits<Type> hidden_type;
        operation_on_both_types(type, hidden_type);
    }
    
...