类类型与非类类型的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!");
}


以上是类类型与非类类型的std::conditional_t的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>