gpt4 book ai didi

c++ - join_rows() 函数的正确类型是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:08 24 4
gpt4 key购买 nike

我写了一个函数 joins the rows of two 2D arrays :

template <typename S, typename T>
Array<typename S::Scalar, Dynamic, Dynamic> join_rows(const ArrayBase<S> & A, const ArrayBase<T> & B) {
Array<typename S::Scalar, Dynamic, Dynamic> C (A.rows(), A.cols()+B.cols());
C << A, B;
return C;
}

我想写一个更通用的函数,可以连接两个以上的数组。

它应该能够与任何可迭代的容器一起工作,例如。 std::liststd::vector,所以我会使用模板参数表。

我可以很容易地用两个 for 循环来调整函数体,这不是问题,我只是在努力弄清楚这样一个函数的正确类型是什么。

(ps。我什至不确定我上面的代码是否有最好的类型,但它似乎可以完成工作)

最佳答案

我不确定如何声明任意 vector Array s,但您可以实现一个函数模板,该模板组合了一个或多个直接传递给它的参数。这通常是通过递归调用自身来完成的,处理每个连续的参数:

// end case (one argument): just forward the same array
template <typename T>
T&& join_rows(T&& A) {
return std::forward<T>(A);
}

// main function template: two or more arguments
template <typename S, typename T, typename... R>
Array<typename S::Scalar, Dynamic, Dynamic> join_rows(const ArrayBase<S>& A,
const ArrayBase<T>& B,
const ArrayBase<R>&... rest) {
Array<typename S::Scalar, Dynamic, Dynamic> C(A.rows(), A.cols()+B.cols());
C << A, B;
return join_rows(C, rest...); // call with the first two arguments combined
}

说明用法的示例:

int main() {
Array<int, 1, 3> arr1 = {1, 2, 3};
Array<int, 1, 2> arr2 = {4, 5};
Array<int, 1, 4> arr3 = {9, 8, 7, 6};

cout << join_rows(arr1, arr2, arr3.reverse()) << endl; // 1 2 3 4 5 6 7 8 9

return 0;
}

如果要限制单参数join_rows只接受 Eigen::Array s,添加一个 std::enable_if检查 ArrayBase<T>基类:

template <typename T>
std::enable_if_t<std::is_base_of<ArrayBase<std::decay_t<T>>,std::decay_t<T>>::value, T&&>
join_rows(T&& A) {
return std::forward<T>(A);
}

对于大Array s,可能有更有效的方法来实现这一点。您可能会返回一个只分配一个新的 Array 的代理对象。对象。

关于c++ - join_rows() 函数的正确类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38998116/

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