类类型与非类类型的std::conditional_t
如何解决这个问题:
template<class T>
struct ResultType
{
using type = std::conditional_t<std::is_class_v<T>, typename T::result_type, void>;
};
如果 T 不是类类型,则不应返回 void,而是:
错误:'int' 不是类、结构或联合类型 24 | using type = std::conditional_tstd::is_class_v<T, typename T::result_type, void>;
所以我不需要尝试调用错误的表达式,但是如何调用呢?
回答
在下面的:
using type = std::conditional_t<std::is_class_v<T>, typename T::result_type, void>;
零件typename T::result_type将在 时失败T = int,因为typename int::result_type格式不正确。
你可以通过使用模板特化来解决这个问题,而不是std::conditional它做完全相同的事情,但避免在不是类类型T::result_type时这样做T:
#include <type_traits>
template <typename T, typename = void>
struct ResultType;
template <typename T>
struct ResultType<T, std::enable_if_t<!std::is_class_v<T>>> {
using type = void;
};
template<typename T>
struct ResultType<T, std::enable_if_t<std::is_class_v<T>>> {
using type = typename T::result_type;
};
// ...
struct X {
using result_type = int;
};
int main() {
static_assert(std::is_same_v<typename ResultType<X>::type, typename X::result_type>, "FAIL!");
static_assert(std::is_same_v<typename ResultType<int>::type, void>, "FAIL!");
}