我正在尝试制作一个带有数字的“元组生成器”,并且
返回带有该数字的元组,同时增加其每个元素
一个。我当然知道这不是元组的真正应用,
但我想尝试一下以学习新知识。这是我所拥有的:
template<int N>
auto getTupleN(int start){
return std::tuple_cat(std::tuple<int>(start), getTupleN<N-1>(start+1));
}
template<>
auto getTupleN<0>(int start){
return std::make_tuple(start);
}
现在,它可以完美运行,并且我可以使用std::get访问元组的元素。但是,我无法推断出类型。
我想用箭头符号编写一个函数,以确保该函数
返回我想要返回的内容,并且我对模板的想法有很好的了解。
这就是我想要的(出于各种原因,它当然不起作用):
template<int N>
// error: ‘getTupleN’ was not declared in this scope
auto getTupleN(int start) -> decltype(std::tuple_cat(std::tuple<int>, getTupleN<N-1>)){
return std::tuple_cat(std::tuple<int>(start), getTupleN<N-1>(start+1));
}
template<>
// error: expected initializer before ‘<’ token
auto getTupleN<0>(int start) -> std::tuple<int>{
return std::make_tuple(start);
}
我认为现在应该可以理解我的问题是什么-我该如何重写此定义,以便它使用箭头符号,因此可以确定它返回了我想要的东西?编辑。
所以我使用了第一个答案的想法,而我得到的错误是:
error: ‘getTupleN’ was not declared in this scope
auto getTupleN(int start) -> decltype(std::tuple_cat(std::tuple<int>(start), getTupleN<N-1>(start+1))){
error: expected initializer before ‘<’ token
auto getTupleN<0>(int start) -> std::tuple<int>{
最佳答案
简而言之,你不能那样做。是鸡肉和鸡蛋。
[basic.scope.pdecl]
1 The point of declaration for a name is immediately after its complete declarator ([dcl.decl]) and before its initializer (if any), except as noted below.
没有尾随返回类型,函数(模板)的声明符是不完整的。就声明而言,在您指定尾随返回类型之前,没有声明
getTupleN
这样的东西(因此您不能使用它来声明返回类型)。即使一般规则下的段落包含异常(exception),也没有异常(exception)会使您的代码格式正确。
关于c++ - 在定义函数时,使用decltype获取函数返回的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65079230/