【发布时间】: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