[英]std::void_t and nested non type members
我在以下代码中得到了意外的结果(第二个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 {};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.