C++ 是否可以在固定命名空间下解析模板类型?
鉴于以下类型:C++ 是否可以在固定命名空间下解析模板类型?,c++,templates,namespaces,decltype,typename,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::N
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{});
模板
无效法律(类型){
使用Alias=typename Type::NestedAlias;
}
法律(对象{});
但是,当模板类型位于resolution操作符的右侧,而左侧是命名空间时,我无法解析。可能吗
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);
}
模板
无效非法(类型){
使用Alias=Hidden::Type;
使用Alias=Hidden::decltype(Type);
使用Alias=typename隐藏::Type;
使用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);
}
模板
无效双\u对象\u用例(类型){
隐藏::类型隐藏\u类型;
两种类型上的操作类型(类型、隐藏类型);
}
要使用的锁销链接:模板不适用于名称,但适用于类型(或值) 目前,使用名称的唯一方法是宏 另一种方法是添加隐藏类型作为别名:
- 在课堂上:
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); }
名称空间隐藏{ 结构对象{ 使用NestedAlias=bool; }; } 结构对象{ 使用NestedAlias=bool; 使用Hidden=Hidden::Object; }; 模板 无效双\u对象\u用例(类型){ typename类型::隐藏类型; 两种类型上的操作类型(类型、隐藏类型); }
- 作为特征:
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); }
struct对象{ 使用NestedAlias=bool; }; 命名空间隐藏{ 模板结构特征; 模板 特征{ 使用NestedAlias=bool; }; } 模板 无效双\u对象\u用例(类型){ typename隐藏::Traits隐藏类型; 两种类型上的操作类型(类型、隐藏类型); }