2012-08-28 10 views
8

मैंने operator<< विशेषज्ञता लिखा है जो boost::multi_array को संभालता है, और ConstMultiArrayConcept का उपयोग करता है ताकि यह बाहरी सरणी और उप-सरणी दोनों पर काम करेगा। मैं सोच रहा हूं, हालांकि, multi_array अवधारणाओं में std::size_t NumDims टेम्पलेट तर्क क्यों है, क्योंकि इसे multi_array से निकाला जा सकता है। में NumDims का एकमात्र उपयोग idgen_helper के लिए रिकर्सन गहराई तर्क के रूप में है, जो स्लाइसिंग का परीक्षण करता है।बढ़ावा क्यों देता है :: 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; 
} 

इस विशेषज्ञता में काम करता है, लेकिन मैं मेरी समझ में कुछ कमी की जानी चाहिए। किसी भी सुराग की सराहना की जाएगी। अवधारणा टेम्पलेट वर्ग के

उत्तर

1

घोषणा:

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

देखें कैसे ConstMultiArrayConcept वास्तव में बूस्ट कोड में प्रयोग किया जाता है:

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=() और sub_array& operator=() कि अन्य ConstMultiArray प्रकार ले में एक ही कोड।

ऐसा लगता है कि NumDimsपारित कर दिया सरणी प्रकार Array की आयाम संख्या नहीं है, यह है कि दिए गए अन्य सरणी प्रकार के साथ काम संगतता की जाँच करता है बाहरी सरणी प्रकार के आयाम संख्या है। तो इसे Array टेम्पलेट पैरामीटर से घटाया नहीं जा सका।

संबंधित मुद्दे