【发布时间】:2015-05-01 21:47:37
【问题描述】:
所以,我想要创建给定类型的多维向量,其中第一个维度将具有函数调用的第一个参数的大小等,例如,如果我这样做
std::size_t n = 5;
auto x = make_vector<int>(n + 1, n * 2, n * 3);
x 应该是 6x10x15 3d 数组(由零组成,因为我现在想默认构造)
我试过这个:
template <typename T>
std::vector<T> make_vector(std::size_t size) {
return std::vector<T>(size);
}
template <typename T, typename... Args>
auto make_vector(std::size_t first, Args... sizes) -> std::vector<decltype(make_vector<T>(sizes...))> {
auto inner = make_vector<T>(sizes...);
return std::vector<decltype(inner)>(first, inner);
}
它似乎适用于 1 或 2 个参数,但对于 3 个参数失败并出现以下错误(clang++)
In file included from /Users/riad/ClionProjects/for-jhelper/output/run.cpp:1:
/Users/riad/ClionProjects/for-jhelper/tasks/TaskC.cpp:12:12: error: no matching function for call to 'make_vector'
auto x = make_vector<int>(n + 1, n * 2, n * 3);
^~~~~~~~~~~~~~~~
/Users/riad/ClionProjects/for-jhelper/tasks/../spcppl/make_vector.hpp:9:6: note: candidate template ignored: substitution failure [with T = int, Args = <unsigned long, unsigned long>]: call to function 'make_vector' that is neither visible in the template definition nor found by argument-dependent lookup
auto make_vector(std::size_t first, Args... sizes) -> std::vector<decltype(make_vector<T>(sizes...))> {
^ ~~~~~~~~~~~
/Users/riad/ClionProjects/for-jhelper/tasks/../spcppl/make_vector.hpp:4:16: note: candidate function template not viable: requires single argument 'size', but 3 arguments were provided
std::vector<T> make_vector(std::size_t size) {
如果我理解正确,问题是当编译器尝试计算 make_vector 的返回值时,它必须知道带有较少参数的向量的返回值,并且无法这样做。我该如何解决?
【问题讨论】:
-
@Columbo,你能详细说明一下吗?
-
您是否认真考虑过
vector<vector<>>?如果您需要多维数组,请使用一维数组并将其包装起来。 -
哦,不知道,性能大幅提升?减少不必要的间接?技术上强制边界一致性?
-
vector
> 与其说是多维数组,不如说是一个列表列表。 -
@Columbo:手动编写的多维数组仍然是错误的:
std::array<std::array<T, N1>, N2>是在固定边界的情况下要走的路。
标签: c++ templates c++11 variadic-templates template-meta-programming