所以,我想要的是创建给定类型的多维向量,其中第一个维度将具有函数调用的第一个参数的大小等,例如,如果我这样做
std::size_t n = 5;
auto x = make_vector<int>(n + 1, n * 2, n * 3);
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
它似乎适用于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); …Run Code Online (Sandbox Code Playgroud) c++ templates template-meta-programming variadic-templates c++11
正如ecatmur所指出的,这个问题在这里已有答案.
这个问题显然不是使用具有可变参数模板函数的decltype的尾随返回类型的重复.它实际上试图提出一个更简单的解决方案来解决该线程中的问题.问题是这个解决方案是否符合标准,因为GCC和clang不同意.只要仔细阅读一下这个问题,你就会意识到这一点.
这个问题的灵感来自于这个问题.我试图提出一个比已经提供的解决方案更简单的解决方案,并最终得到:
#include <iostream>
struct S {
template <typename T>
static T sum(T t){
return t;
}
template <typename T, typename ...U>
static auto sum(T t, U... u) -> decltype(t + sum(u...)) {
return t + sum(u...);
}
};
int main() {
std::cout << S::sum(1, 1.5, 2) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
虽然这个解决方案适用于GCC,但它根本没有解决问题.所以,我想知道哪一个是正确的.