模板中的自动返回类型

时间:2017-05-16 09:50:24

标签: c++ c++11 templates auto

我的代码中有各种模块的多个数据类,我不想修改它们。 我有一个容器类,每个都有一个指向这个数据类的指针,并且还有一个指向一个类的指针,该类用于保存这些类而不知道它们。

所以在我实现的容器类中:

DataClass GetMyData (void){
   return myData;
}

在我创建的这些投币课程的集合中

template<class ContainerClass>
ContainerClass  GetContainer (void);

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

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

  

返回&#39; auto&#39;在定义之前不能使用

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

1 个答案:

答案 0 :(得分:6)

如果您忘记了return中的GetData()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(); }