代码之家  ›  专栏  ›  技术社区  ›  NoSenseEtAl

std::void\ t和嵌套的非类型成员

  •  2
  • NoSenseEtAl  · 技术社区  · 8 年前

    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 代码按预期工作。

    decltype 围绕 num_items

    我这样假设对吗 void_t 只适用于类型?

    有没有更好的方法来做我想做的事?
    当有很长的名字和很深的嵌套时,很难在真正的代码中阅读,所以如果有更好的方法来处理这个问题的话 无效\ 或者其他我想知道的模板代码。

    1 回复  |  直到 8 年前
        1
  •  4
  •   max66    8 年前

    举个例子,我觉得你的 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 {};