2012-08-28 5 views
8

boost::multi_arrayを扱うoperator<<の専門書を書いて、それは外側の配列とサブアレイの両方で動作するようにConstMultiArrayConceptを使用しました。しかし、なぜmulti_arrayのコンセプトにstd::size_t NumDimsテンプレート引数があるのだろうと思っています。これは、単にmulti_arrayから抽出することができるからです。 ConstMultiArrayConceptNumDimsの唯一の使用は、スライシングをテストするidgen_helperの再帰深度argとしてです。参考のためなぜ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> >(); 
     ... 

ConstMultiArrayタイプを取るmulti_array_view& operator=()sub_array& operator=()で同じコードを。

NumDimsように見えるが、渡された配列型Array次元数ではない、それは与えられた他のアレイ型に代入互換性をチェックし、外側アレイ型の次元数です。したがって、Arrayテンプレートパラメータから推測できませんでした。

関連する問題