boost::multi_array
を扱うoperator<<
の専門書を書いて、それは外側の配列とサブアレイの両方で動作するようにConstMultiArrayConcept
を使用しました。しかし、なぜmulti_array
のコンセプトにstd::size_t NumDims
テンプレート引数があるのだろうと思っています。これは、単にmulti_array
から抽出することができるからです。 ConstMultiArrayConcept
にNumDims
の唯一の使用は、スライシングをテストするidgen_helper
の再帰深度argとしてです。参考のためなぜboost :: multi_arrayのConstMultiArrayConceptにNumDimsテンプレート引数があるのですか?
、ここ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;
}
だこの特殊化は動作しますが、私は私の理解で何かが欠けている必要があります。すべての手がかりをいただければ幸いです。コンセプトのテンプレートクラスの