Почему 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
параметр шаблона.