gpt4 book ai didi

c++ - 为什么 boost::multi_array 的 ConstMultiArrayConcept 有一个 NumDims 模板参数?

转载 作者:可可西里 更新时间:2023-11-01 17:59:41 26 4
gpt4 key购买 nike

我写了一个 operator<<处理 boost::multi_array 的特化, 并使用 ConstMultiArrayConcept这样它就可以在外部阵列和子阵列上工作。不过,我想知道为什么 multi_array概念有一个 std::size_t NumDims模板参数,因为它可以简单地从 multi_array 中提取出来.唯一使用 NumDimsConstMultiArrayConcept作为 idgen_helper 的递归深度 arg , 测试切片。

作为引用,这里是 multi_array 的 header 概念: 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;
}

这个特化是有效的,但我一定在理解上遗漏了一些东西。任何线索将不胜感激。

最佳答案

概念模板类声明:

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

看看 ConstMultiArrayConcept 在 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> >();
...

multi_array_view& operator=()sub_array& operator=() 中采用其他 ConstMultiArray 类型的相同代码。

看起来 NumDims 不是传递的数组类型 Array 的维数,它是检查赋值与给定兼容性的外部数组类型的维数其他数组类型。所以它不能从Array模板参数中推导出来。

关于c++ - 为什么 boost::multi_array 的 ConstMultiArrayConcept 有一个 NumDims 模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com