std::void_t 和嵌套的非类型成员

std::void_t and nested non type members

本文关键字:成员 嵌套 类型 void std      更新时间:2023-10-16

我有以下代码,我得到意想不到的结果(第二次static_assert失败(:

#include <type_traits>
template <typename T, typename = void>
struct is_bananas : std::false_type {};
template <typename T>
struct is_bananas<T, std::void_t<typename T::config::num_items>>
: std::true_type {};
struct Config{
static constexpr int num_items=42;
};
struct Bananas{
using config = Config;
};
static_assert(is_bananas<int>::value == false);
static_assert(is_bananas<Bananas>::value == true);

当我使用T::config而不是T::config::num_items代码按预期工作时。

如果我在num_items周围使用decltype,那么它可以工作。

我假设void_t仅适用于类型是否正确?

有没有更好的方法来做我想做的事?
如果有人对此感到困惑(并认为:只需抛出decltype( - 当有长名称和深度嵌套时,我发现decltype很难在实际代码中阅读,所以如果有更好的方法可以使用void_t或任何其他模板代码来做到这一点我想知道。

有没有更好的方法来做我想做的事?

好和好是主观的。

通过示例,我发现您的decltype()解决方案非常好。

无论如何。。。一种可能的替代方法是定义一个替代std::void_t使用值类型

作为

template <auto...>
using value_void_t = void;

并写入

template <typename T>
struct is_bananas<T, value_void_t<T::config::num_items>>
: std::true_type {};