是否可以在固定名称空间下解析模板类型?

时间:2018-11-07 06:19:56

标签: c++ templates namespaces decltype typename

给出以下类型:

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);
}

Godbolt链接可用于:https://godbolt.org/z/LRNK0b

1 个答案:

答案 0 :(得分:1)

模板不适用于名称,但可以用于类型(或值)。

当前,唯一使用名称播放的方法是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);
    }