【问题标题】:Is it possible to resolve a template type under a fixed namespace?是否可以在固定命名空间下解析模板类型?
【发布时间】:2018-11-07 06:19:55
【问题描述】:

给定以下类型:

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

【问题讨论】:

  • 这毫无意义。您的模板类型已经是一种类型,将命名空间粘贴到现有类型毫无意义。
  • 你想在这里完成什么?为什么认为你需要在那里粘贴一个命名空间?
  • @tkausl (cc StoryTeller) 我已经用我的用例更新了帖子。我需要对模板化类型和特定命名空间中完全相同的类型名称(但不同的对象)进行操作。
  • 显然是xy-problem...
  • @P.W 人们可以实现一种精确映射问题的解决方案 - 但是使用宏而不是模板,因为后者需要语言不支持的功能。但是,问题是,这个解决方案是否适合真正应该解决的问题。如果回到我的供暖示例:“我需要一个暖风机——我在哪里可以买到?”我们现在都说“去下一个 DIY 商店!”,但如果用户问“我的公寓很冷,我怎样才能让它暖和一点?”我们只会告诉“将恒温器设置得更高”。现在哪个是更合适的解决方案?

标签: c++ templates namespaces decltype typename


【解决方案1】:

模板不适用于 name,但适用于类型(或值)。

目前,玩名字的唯一方法是 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);
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多