2012-08-28 7 views
8

Napisałem specjalizację operator<<, która obsługuje boost::multi_array i używa ConstMultiArrayConcept, aby działała zarówno na zewnętrznej macierzy, jak i pod-tablicach. Zastanawiam się jednak, dlaczego pojęcia multi_array mają argument szablonu std::size_t NumDims, ponieważ można go po prostu wyodrębnić z multi_array. Jedynym użyciem NumDims w ConstMultiArrayConcept jest jako głębokość rekurencji arg dla idgen_helper, która testuje krojenie.Dlaczego constMultiArrayConcept boost :: multi_array ma argument szablonu NumDims?

Dla porównania, oto nagłówek dla multi_array pojęć: http://www.boost.org/doc/libs/1_51_0/boost/multi_array/concept_checks.hpp

A oto moja przeciążona 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; 
} 

Specjalizacja ta działa, ale musi być czegoś brakuje w moim rozumieniu. Wszelkie wskazówki zostaną docenione.

Odpowiedz

1

Deklaracja koncepcji klasy szablonu:

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

Zobacz jak ConstMultiArrayConcept jest faktycznie wykorzystywany w kodzie 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> >(); 
     ... 

Ten sam kod w multi_array_view& operator=() i sub_array& operator=() że podejmuje inne ConstMultiArray typu.

Wygląda NumDimsnie jest liczba wymiar przeszedł typu array Array, to liczba wymiarem zewnętrznym typu array, który sprawdza zgodność z danym przypisania innego rodzaju tablicy. Nie można więc wywnioskować z parametru szablonu Array.

Powiązane problemy