微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++中Boost.MultiArray的增量运算符

如何解决C ++中Boost.MultiArray的增量运算符

我正在尝试为C ++中的Boost.MultiArray实现增量运算符重载函数operator++。此增量运算符的主要思想是对Boost.MultiArray中的每个元素应用“增量一”操作(++)。换句话说,每个元素总是可累加的。 is_summable概念如下创建。

template<typename T>
concept is_summable = requires(T x) { x + x; };

为了处理Boost.MultiArray中的所有类型,包括boost::multi_arrayboost::detail::multi_array::sub_arrayboost::detail::multi_array::const_sub_array,还创建了一组概念。

template<typename T>
concept is_multi_array = requires(T x)
{
    x.num_dimensions();
    x.shape();
    boost::multi_array(x);
};

template<typename T>
concept is_sub_array = requires(T x)
{
    x.num_dimensions();
    x.shape();
    boost::detail::multi_array::sub_array(x);
};

template<typename T>
concept is_const_sub_array = requires(T x)
{
    x.num_dimensions();
    x.shape();
    boost::detail::multi_array::const_sub_array(x);
};

主要的实验增量运算符重载模板功能

//  Element Increment Operator
template<class T> requires is_summable<T>
auto operator++(T& input)
{
    auto output = input;
    input++;
    return output;
}

template<class T> requires (is_multi_array<T> || is_sub_array<T> || is_const_sub_array<T>)
auto operator++(T& input)
{
    boost::multi_array output(input);
    for (decltype(+input.shape()[0]) i = 0; i < input.shape()[0]; i++)
    {
        input[i]++;
    }
    return output;
}

但是,问题在于以下测试代码中发生了编译错误more than one operator "++" matches these operands

// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double,3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);

// Assign values to the elements
int values = 1;
for (index i = 0; i != 3; ++i)
    for (index j = 0; j != 4; ++j)
        for (index k = 0; k != 2; ++k)
            A[i][j][k] = values++;

for (index i = 0; i != 3; ++i)
    for (index j = 0; j != 4; ++j)
        for (index k = 0; k != 2; ++k)
            std::cout << A[i][j][k] << std::endl;

auto test_result = A++;

for (index i = 0; i != 3; ++i)
    for (index j = 0; j != 4; ++j)
        for (index k = 0; k != 2; ++k)
            std::cout << A[i][j][k] << std::endl;
for (index i = 0; i != 3; ++i)
    for (index j = 0; j != 4; ++j)
        for (index k = 0; k != 2; ++k)
            std::cout << test_result[i][j][k] << std::endl;

这个问题有解决方案吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?