簡體   English   中英

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 {};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM