模板中的自动返回类型
Auto return type in template
本文关键字:返回类型 更新时间:2023-10-16
我在代码中的各种模块中有多个数据类,我不打算对其进行任何修改。 我为每个容器类都有一个容器类,它们有一个指向此数据类的指针,并且还获得了一个指向一个类的指针,该类旨在保存这些类而不了解它们。
所以在我实现的容器类中:
DataClass GetMyData (void){
return myData;
}
在我创建的这些硬币类的集合中
template<class ContainerClass>
ContainerClass GetContainer (void);
template<class ContainerClass>
auto GetData (void){
GetContainer<ContainerClass> ().GetMyData();
}
但是每当我尝试使用此 GetData 函数时,我都会收到错误
返回"auto"的函数在定义之前不能使用
所以我的问题是,在这种情况下是否可以使用 auto (c++11),或者我必须用 2 个类制作我的模板?
如果你在GetData()
中忘记了return
,auto
不能工作是没有用的,返回模板类型getData()
返回的相同类型(感谢Jarod42!
无论如何。。。给出几个结构,如下所示
struct A
{ int getData () const { return 1; } };
struct B
{ std::string getData () const { return "abc"; } };
在 C++14 中,GetData()
可以简单地写成
template <class CC>
auto GetData ()
{ return CC{}.getData(); }
但这在 C++11 中不起作用;在 C++11 中你可以写
template <class CC>
auto GetData () -> decltype( CC{}.getData() )
{ return CC{}.getData(); }
在 C++11 之前没有(这种使用)auto
.
---编辑---
正如 StoryTeller 所指出的,使用decltype( CC{}.getData() )
假定类型CC
是默认可构造的。
在我写的玩具示例中,这不是问题,因为我在函数的主体中使用了CC{}
。
在简单的情况下,您可以在decltype()
表达式中镜像函数主体中返回的内容;例如,如果您传递一个类型CC
的对象,则可以编写
template <class CC>
auto GetData (CC const & cc) -> decltype( cc.getData() )
{ return cc.getData(); }
但事情并没有那么简单:在某些情况下,你知道返回的值是一个给定的表达式,但函数在decltype()
表达式中镜像它很复杂。
因此,为了避免可构造/不可构造的问题,最好使用(如StoryTeller建议;谢谢)std::declval
;如下,通过示例
template <class CC>
auto GetData () -> decltype( std::declval<CC>().getData() )
{ /* something complicated ... */ return something.getData(); }
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 推导 std::vector::back() 的返回类型
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 基于返回类型的转换和过载扣除
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*