【发布时间】:2012-08-28 16:40:41
【问题描述】:
我编写了一个处理boost::multi_array 的operator<< 特化,并使用了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;
}
这种专业化很有效,但我的理解中一定遗漏了一些东西。任何线索将不胜感激。
【问题讨论】:
标签: c++ boost boost-multi-array c++-concepts