8

我编写了一个operator<<专门处理boost::multi_array, 并使用ConstMultiArrayConcept它,以便它可以在外部数组和子数组上工作。不过,我想知道为什么这些multi_array概念有一个std::size_t NumDims模板参数,因为它可以简单地从multi_array. NumDimsin的唯一用途ConstMultiArrayConcept是作为 的递归深度参数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;
}

这种专业化工作,但我必须在我的理解中遗漏一些东西。任何线索将不胜感激。

4

1 回答 1

1

概念模板类声明:

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

查看ConstMultiArrayConceptBoost 代码中的实际使用方式:

 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& operator=()sub_array& operator=()其他ConstMultiArray类型。

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

于 2012-11-12T15:13:25.113 回答