c++ - 在定义函数时,使用decltype获取函数返回的类型

标签 c++ templates variadic-templates variadic-functions

我正在尝试制作一个带有数字的“元组生成器”,并且
返回带有该数字的元组,同时增加其每个元素
一个。我当然知道这不是元组的真正应用,
但我想尝试一下以学习新知识。这是我所拥有的:

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/

相关文章:

c++ - 为什么 std::get 只有 range::subrange 的两个函数重载?

C++ 模板 "is not a type"错误

c++ - 成员模板静态函数的类型特征

c++ - 对基类模板成员函数的访问不明确

c++ - 如何在 C++ 中更改 QTabWidget 中的文本对齐方式?

c++ - C++ 中的严格弱排序运算符

c++ - Armadillo C++ : Passing a submatrix into a function

c++ - 外联可变参数模板函数

c++ - 使用存储在可变数据结构中的字段作为方法参数

c++ - 具有默认类型的可变参数模板