std::void_t 和嵌套的非类型成员
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 {};
相关文章:
- 嵌套在类中时无法设置成员数据
- 如何在 C++ 的外部类构造函数中初始化嵌套类成员
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- std::void_t 和嵌套的非类型成员
- C2436 '{ctor}':构造函数初始值设定项列表中的成员函数或嵌套类
- c++ 嵌套结构映射找不到成员
- 无法从多态嵌套类访问包含类的成员
- 其他类的成员函数对成员函数的嵌套引用
- 如何从嵌套在命名空间中的类调用成员函数?
- 返回自身内部的双重嵌套类的成员函数,该类继承自从自身继承的类
- 嵌套的类成员变量不可访问.链表设置.V、下一个和新的问题
- 当使用嵌套类功能时,使用非静态数据成员的使用无效,但是当函数未固定时可以
- 包含指针成员的嵌套结构
- 缩短成员函数作用域说明符(嵌套类)(C++)
- 为什么嵌套类的成员函数不需要完整类型?
- 访问嵌套结构的数据成员并将结构传递到功能C
- 静态模板成员的嵌套静态模板成员
- 如何在 C++ 中将结构类型向量数据输入到结构向量成员(嵌套结构向量)中