Ich schrieb eine operator<<
Spezialisierung, die boost::multi_array
behandelt, und ConstMultiArrayConcept
verwendet, so dass es auf dem äußeren Array und den Sub-Arrays funktionieren würde. Ich frage mich jedoch, warum die multi_array
Konzepte ein std::size_t NumDims
Template-Argument haben, da das einfach aus der multi_array
extrahiert werden kann. Die einzige Verwendung von NumDims
in ConstMultiArrayConcept
ist als eine Rekursionstiefe arg für idgen_helper
, die Slicing testet.Warum hat boost :: multi_array's ConstMultiArrayConcept ein NumDims Template-Argument?
Als Referenz ist hier der Header für multi_array
Konzepte: http://www.boost.org/doc/libs/1_51_0/boost/multi_array/concept_checks.hpp
Und hier ist meine überladene 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;
}
Diese Spezialisierung funktioniert, aber ich muss etwas in meinem Verständnis fehlen. Irgendwelche Hinweise werden geschätzt.