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
或我想知道的任何其他模板代码。
Is there a nicer way to do what I want?
好和更好是主观的。
例如,我发现您的 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 {};
我在以下代码中得到了意外结果(第二个 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?
好和更好是主观的。
例如,我发现您的 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 {};