给出以下类型:
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
答案 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);
}