【问题标题】:Why does boost::multi_array's ConstMultiArrayConcept have a NumDims template argument?为什么 boost::multi_array 的 ConstMultiArrayConcept 有一个 NumDims 模板参数?
【发布时间】:2012-08-28 16:40:41
【问题描述】:

我编写了一个处理boost::multi_arrayoperator<< 特化,并使用了ConstMultiArrayConcept,以便它可以在外部数组和子数组上工作。不过,我想知道为什么multi_array 概念有一个std::size_t NumDims 模板参数,因为它可以简单地从multi_array 中提取出来。 NumDimsConstMultiArrayConcept 中的唯一用途是作为idgen_helper 的递归深度参数,用于测试切片。

作为参考,这里是 multi_array 概念的标题: http://www.boost.org/doc/libs/1_51_0/boost/multi_array/concept_checks.hpp

这是我超载的operator<<

template <typename CharT, typename Traits, typename MultiArrayT>
BOOST_CONCEPT_REQUIRES(
                       ((boost::multi_array_concepts::ConstMultiArrayConcept<MultiArrayT, MultiArrayT::dimensionality>)),
                       (std::basic_ostream<CharT, Traits>&)) // return type
operator <<( std::basic_ostream<CharT, Traits>& os, MultiArrayT const& ary )
{
    typename std::basic_ostream<CharT, Traits>::sentry opfx( os );

    if ( opfx ) {
        boost::multi_array_types::size_type const* sizes = ary.shape();
        // using Mathematica array notation
        os << "{";
        for ( int i = 0; i < sizes[0]; ++i ) {
            if ( i > 0 ) os << ", ";
            // verbose just to keep the types apparent
            typedef typename MultiArrayT::const_reference subType;
            subType item = ary[i];
            os << item;
        }
        os << "}\n";
    }
    return os;
}

这种专业化很有效,但我的理解中一定遗漏了一些东西。任何线索将不胜感激。

【问题讨论】:

    标签: c++ boost boost-multi-array c++-concepts


    【解决方案1】:

    概念模板类的声明:

    template <typename Array, std::size_t NumDims>  struct ConstMultiArrayConcept
    {
    ...
    };
    

    看看ConstMultiArrayConcept是如何在Boost代码中实际使用的:

     template <typename T, std::size_t NumDims>
     class multi_array_ref {
       ...
       // Assignment from other ConstMultiArray types.
       template <typename ConstMultiArray>
       multi_array_ref& operator=(const ConstMultiArray& other)
       {
          function_requires< 
             detail::multi_array::
             ConstMultiArrayConcept<ConstMultiArray,NumDims> >();
          ...
    

    multi_array_view&amp; operator=()sub_array&amp; operator=() 中的相同代码采用其他 ConstMultiArray 类型。

    看起来NumDims 不是传递的数组类型Array的维数,它是外部数组类型的维数,用于检查与给定其他数组类型的赋值兼容性。所以无法从Array模板参数推导出来。

    【讨论】:

      猜你喜欢
      • 2012-11-01
      • 2011-05-12
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多