2012-08-28 5 views
8

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.

Antwort

1

Erklärung Konzept Template-Klasse:

template <typename Array, std::size_t NumDims> struct ConstMultiArrayConcept 
{ 
... 
}; 

Sehen Sie, wie ConstMultiArrayConcept tatsächlich in Boost-Code verwendet wird:

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> >(); 
     ... 

Der gleiche Code in multi_array_view& operator=() und sub_array& operator=(), die anderen nehmen ConstMultiArray Typ.

Aussehen wie NumDimsnicht Dimension Anzahl von hindurchgegangenen Array-Typ Array, es ist Dimension Anzahl von äußeren Anordnungstyp die Zuweisungs Kompatibilität mit bestimmten anderen Array-Typ überprüft. Es konnte also nicht von Array Template-Parameter abgeleitet werden.