Почему ConstMultiArrayConcept boost:: multi_array имеет аргумент шаблона NumDims?

Я написал operator<< специализация, которая обрабатывает boost::multi_arrayи использовал ConstMultiArrayConcept так что он будет работать как на внешнем массиве, так и на подмассивах. Мне интересно, однако, почему multi_array понятия имеют std::size_t NumDims аргумент шаблона, поскольку он может быть просто извлечен из multi_array, Единственное использование NumDims в 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;
}

Эта специализация работает, но я должен что-то упустить в моем понимании. Любые подсказки будут оценены.

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& operator=() а также sub_array& operator=() что взять другой ConstMultiArray тип.

Похоже NumDims не номер измерения переданного типа массива Arrayэто номер измерения типа внешнего массива, который проверяет совместимость присваивания с данным другим типом массива. Так что это не может быть выведено из Array параметр шаблона.

Другие вопросы по тегам