繁体   English   中英

我如何使用扣除来选择function的返回类型

[英]How do i use deduction to choose the return type of function

我对使用 C++11 标准的函数进行完全推导有疑问。 基本上我应该制作一个 function,它采用一个看起来应该像矩阵(基本上是任何容器)的参数,其元素可以再次是任何容器,但请记住每一行的元素不一定需要相同的大小。 例如,参数可以是双端队列的向量、经典的类 C 矩阵、向量的向量、向量的双端队列等等,你明白了。 话说回来。 Function 本身需要动态分配(使用碎片而不是连续分配) memory 对于具有相同结构和元素类型的二维矩阵,然后将给定矩阵中的所有元素复制到其中,最后返回一个双指针,您可以使用它来访问矩阵的元素。 话虽如此,我实际上并不知道如何使用完全推导,以便 function 实际上知道哪种类型是它必须返回的双指针。 我想到的第一件事是使用这样的东西:

template <typename MatrixType>
auto CreateMatrix (MatrixType M) -> decltype ... 

它背后的逻辑是完全推导会找出必须返回什么类型的双指针,但三个点 (...) 是我停止的地方,我实际上不知道在那里写什么。

当然我可能会做这样的事情:

template <typename MatrixType>
MatrixType** CreateMatrix (MatrixType M) 

但它不使用扣除,因为这样调用:

std::vector<std::deque<double>> a = {...};
auto x = CreateMatrix(a);

如果不在 function 的调用中使用<double>将无法工作,所以它不是一个完整的“问题解决”,它只是一个廉价的技巧。

Memory 分配应该不难,我想这很容易做到,但目前我被困在这里,不知道该怎么办。

我很感激每一个帮助!

我仍然不确定我是否理解你想做什么。 我将专注于实际问题:当容器可以由标准容器或 C arrays 制成时,如何从二维容器推断值类型?

您可以使用类型特征。 标准容器有一个value_type成员别名。 当二维数组作为指针T**传递时,值类型为T 当通过引用传递数组T[M][N]时,值类型为T

template <typename T>
struct value_type { using type = typename T::value_type; };

template <typename T>
struct value_type< T*> { using type = T; };

template <typename T,size_t N>
struct value_type< T[N] > { using type = T;};

template <typename T>
struct value_type2d {
    using type = typename value_type<typename value_type<T>::type>::type;
};

作为示例,我使用了 function,它简单地返回了第一个元素:

template <typename Matrix>
typename value_type2d<Matrix>::type foo(const Matrix& m) {
    return m[0][0];
}



int main() {
    std::vector<std::vector<double>> x{{42,1},{2,3}};
    std::cout << foo(x) << "\n";
    std::vector<std::deque<double>> y{{42,1},{2,3}};
    std::cout << foo(x) << "\n";
    int z[2][2] = {{42,1},{2,3}};
    std::cout << foo(z) << "\n";
    std::vector<std::string> w[2] = {{"42","1"},{"2","3"}};
    std::cout << foo(x) << "\n";
}

现场演示

PS:是的decltype( M[0][0] )是获取值类型的更简单方法。 尽管例如std::map::operator[]不是const ,并且当 function 不修改参数时,您不应传递非 const 引用。 而且您当然不希望复制整个矩阵只是为了将其传递给 function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM