Sto*_*ard 8 c++ boost boost-multi-array c++-concepts
我编写了一个operator<<处理的专门化boost::multi_array,并使用ConstMultiArrayConcept它以便它可以在外部数组和子数组上工作.我想知道,为什么这些multi_array概念有一个std::size_t NumDims模板参数,因为它可以简单地从中提取出来multi_array.NumDimsin 的唯一用途ConstMultiArrayConcept是作为递归深度arg idgen_helper,用于测试切片.
作为参考,这里是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;
}
Run Code Online (Sandbox Code Playgroud)
这种专业化有效,但我必须在我的理解中遗漏一些东西.任何线索将不胜感激.
概念模板类声明:
template <typename Array, std::size_t NumDims> struct ConstMultiArrayConcept
{
...
};
Run Code Online (Sandbox Code Playgroud)
看看ConstMultiArrayConceptBoost代码中实际是如何使用的:
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> >();
...
Run Code Online (Sandbox Code Playgroud)
multi_array_view& operator=()和中的相同代码sub_array& operator=()采用其他ConstMultiArray类型。
看起来NumDims 不是传递的数组类型的维数Array,它是外部数组类型的维数,用于检查与给定其他数组类型的赋值兼容性。所以无法从Array模板参数中推断出来。
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |