2012-08-28 13 views
8

boost::multi_array'u işleyen bir operator<< uzmanlık yazdım ve ConstMultiArrayConcept kullanıldı, böylece hem dış dizilerde hem de alt dizilerde çalışacaktı. Yine de, multi_array kavramlarının neden std::size_t NumDims şablon argümanına sahip olduğunu merak ediyorum, çünkü bu sadece multi_array'dan çıkarılabilir. NumDims'un ConstMultiArrayConcept'daki tek kullanımı, dilimlemeyi test eden idgen_helper için bir tekrarlama derinliği argidir. Başvuru içinNeden boost :: multi_array ConstMultiArrayConcept bir NumDims şablon argümanına sahip?

, burada multi_array konseptler için başlık var: Burada http://www.boost.org/doc/libs/1_51_0/boost/multi_array/concept_checks.hpp

Ve 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; 
} 

Bu uzmanlık çalışır aşırı, ama benim anlayış şey eksik gerekir. Herhangi bir ipucu takdir edilecektir. kavram şablon sınıfının

cevap

1

Beyanı:

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

ConstMultiArrayConcept aslında Boost kodunda nasıl kullanıldığını bakınız:

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

multi_array_view& operator=() ve diğer ConstMultiArray türünü almak sub_array& operator=() aynı kodu.

NumDimsgeçen dizi türü Array arasında boyutu sayı değil gibi, belirli bir diğer dizi türü ile atama uyumluluğunu kontrol eder dış düzen tipinde boyutu numarası görünüyor. Dolayısıyla, Array şablon parametresinden çıkarılamadı.

İlgili konular