【发布时间】:2021-01-26 22:38:50
【问题描述】:
我正在处理一些可能定义了嵌套类型的类。每当没有定义这个嵌套类型时,我就假装这个嵌套类型是void。例如,下面是应该工作的代码:
struct HasNestedTypeDefined {
using Nested = int;
};
struct VoidNestedTypeDefined {
using Nested = void;
};
struct NoNestedTypeDefined {
};
static_assert(!std::is_same_v<reveal_nested_type< HasNestedTypeDefined>::type, void>);
static_assert( std::is_same_v<reveal_nested_type< HasNestedTypeDefined>::type, int>);
static_assert( std::is_same_v<reveal_nested_type<VoidNestedTypeDefined>::type, void>);
static_assert(!std::is_same_v<reveal_nested_type<VoidNestedTypeDefined>::type, int>);
static_assert( std::is_same_v<reveal_nested_type< NoNestedTypeDefined>::type, void>);
static_assert(!std::is_same_v<reveal_nested_type< NoNestedTypeDefined>::type, int>);
到目前为止,我已经完成了这项工作:
template<typename T, typename R = void>
struct enable_if_type {
using type = R;
};
template<typename T, typename = void>
struct reveal_nested_type {
using type = void;
};
template<typename T>
struct reveal_nested_type<T, typename enable_if_type<typename T::Nested>::type> {
using type = typename T::Nested;
};
我认为即使不使用enable_if_type,SFINAE 也应该可以工作,就像这样:
template<typename T, typename = void>
struct reveal_nested_type {
using type = void;
};
template<typename T>
struct reveal_nested_type<T, typename T::Nested> {
using type = typename T::Nested;
};
但在这种情况下从不使用偏特化,即使定义了typename T::Nested。为什么 SFINAE 会忽略它?后续问题:是否有更惯用的方法来实现相同的功能?
【问题讨论】:
标签: c++ inner-classes sfinae typetraits