2012-08-28 31 views
8

我写了一个operator<<专业化处理boost::multi_array,并使用ConstMultiArrayConcept,以便它可以在外部数组和子数组上工作。不过,我想知道为什么multi_array概念有一个std::size_t NumDims模板参数,因为它可以从multi_array中简单提取。 ConstMultiArrayConcept中的NumDims的唯一用途是作为测试分片的idgen_helper的递归深度参数。为什么boost :: 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模板参数中推导出来。

相关问题