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

为什么“std::integral_content”有一个引用自身的“::type”?

  •  1
  • HolyBlackCat  · 技术社区  · 7 月前

    我正在阅读上的文档 std::integral_constant ,显然它包括 using type 指的是它自己。

    template <typename T, T Value>
    struct integral_constant
    {
        using type = integral_constant<T, Value>;
        // ...
    };
    

    这个typedef是用来做什么的?

    要访问它,你已经需要知道它的类型,所以我看不出它会带来什么好处。

    2 回复  |  直到 7 月前
        1
  •  3
  •   Artyer    7 月前

    从…起 N1424 :

    为布尔特征的结果提供类型表示的一个重要用例来自模板元编程,在这门学科中,类模板被视为编译时可调用实体(元函数),经验表明,要构建一个一致一致的内插组件框架,元函数提供一种单一的通用调用形式至关重要[ 11 ]. 由于可以将积分常数封装在类型中,但不能反过来,因此重新编写了boost类型特征库的实现,以通过它们的 static const bool value 成员和嵌套类型typedef,从而暴露出整数常量的相应专门化 type 包装。

    所以,如果你有一些重载函数,比如:

    void do_something(std::true_type);
    void do_something(std::false_type);
    

    对于任何“布尔特征”,您总是可以使用 do_something(typename Trait<T>::type{}) .

    Trait 是从其他模板元编程中构建的,这可能只会提供 类型 成员,但不是 value (因为它是针对类型的),例如:

    template<typename Trait, typename T>
    void call_do_something() {
        do_something(typename Trait<T>::type{});
    }
    
    int main() {
        using namespace mp = ::metaprogramming_library;
        using is_single_dim_array = mp::partial<mp::ic_equal, std::integral_constant<std::size_t, 1>, std::rank>;
        // partial only has a member type because it's meant for type tratis
        call_do_something<is_single_dim_array::type, int[1]>();
        call_do_something<is_single_dim_array::type, int[1][2]>();
    }
    
        2
  •  0
  •   user12002570    7 月前

    要访问它,你已经需要知道它的类型,所以我看不出它会带来什么好处。这个typedef是用来做什么的?

    这可以从中回答 meta.help 上面写着:

    类模板 integral_constant ,别名模板 bool_constant ,及其关联的typedef名称 true_type false_type 用作基类来定义各种类型特征的接口 .

    推荐文章