2012-08-28 10 views
8

Escribí una especialización operator<< que maneja boost::multi_array, y usé ConstMultiArrayConcept para que funcionara tanto en la matriz externa como en las sub-matrices. Me pregunto, sin embargo, por qué los conceptos multi_array tienen un argumento de plantilla std::size_t NumDims, ya que eso se puede extraer simplemente del multi_array. El único uso de NumDims en ConstMultiArrayConcept es como una profundidad de recursión arg para idgen_helper, que prueba el corte.¿Por qué boost :: multi_array's ConstMultiArrayConcept tiene un argumento de plantilla NumDims?

Como referencia, aquí está el encabezado de multi_array conceptos: http://www.boost.org/doc/libs/1_51_0/boost/multi_array/concept_checks.hpp

Y aquí está mi sobrecargada 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; 
} 

Esta especialización funciona, pero debe estar pasando algo en mi entendimiento. Cualquier pista será apreciada.

Respuesta

1

Declaración del concepto de clase de plantilla:

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

Vea cómo ConstMultiArrayConcept se utiliza realmente en el código 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> >(); 
     ... 

El mismo código en multi_array_view& operator=() y sub_array& operator=() que tomar otro tipo ConstMultiArray.

Parece que NumDimsno es número dimensión del pasado tipo array Array, es el número dimensión del tipo de matriz externa que comprueba la compatibilidad con asignación dado otro tipo de matriz. Por lo tanto, no se pudo deducir del parámetro de plantilla Array.

Cuestiones relacionadas