模板中的自动返回类型

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()中忘记了returnauto不能工作是没有用的,返回模板类型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(); }