gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:52:21 24 4
gpt4 key购买 nike

我在以下代码中得到了意外结果(第二个 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 或我想知道的任何其他模板代码执行此操作的更好方法。

最佳答案

Is there a nicer way to do what I want?

Nice 和 nicer 是主观的。

例如,我发现您的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 {};

关于c++ - std::void_t 和嵌套的非类型成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52066493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com