自动 return 输入模板

Auto return type in template

我在代码的各个模块中有多个数据 classes,我不打算对其进行任何修改。 我为它们每个都有一个容器 classes,它有一个指向此数据 class 的指针,还有一个指向 class 的指针,该 class 旨在保存这些 class 不知道他们。

所以在容器中 classes 我实现了:

DataClass GetMyData (void){
   return myData;
}

并且在这些硬币容器的集合中class我创建

template<class ContainerClass>
ContainerClass  GetContainer (void);

template<class ContainerClass>
auto    GetData (void){
    GetContainer<ContainerClass> ().GetMyData();
}

但每当我尝试使用此 GetData 函数时,我都会收到错误消息

a function that returns 'auto' cannot be used before it is defined

所以我的问题是,在这种情况下是否可以使用 auto (c++11),或者我必须使用 2 classes 制作我的模板?

如果忘记了returnGetData(),auto就不行对return同类型没用return由模板类型的 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()表达式中反映函数体中return的作用;例如,如果你传递一个CC类型的对象,你可以写成

template <class CC>
auto GetData (CC const & cc) -> decltype( cc.getData() )
 { return cc.getData(); }

但从来没有这么简单:在某些情况下,您知道值 returned 是一个给定的表达式,但函数太复杂了,无法在 decltype() 表达式中反映它。

因此,为了避免 contructible/not 可构建的问题,最好使用(如 StoryTeller 所建议;谢谢)std::declval;如下,举例

template <class CC>
auto GetData () -> decltype( std::declval<CC>().getData() )
 { /* something complicated ... */ return something.getData(); }