[英]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.