繁体   English   中英

模板中的自动返回类型

[英]Auto return type in template

我在代码的各个模块中拥有多个数据类,我无意进行任何修改。 我为每个容器都有一个容器类,这些容器类有一个指向该数据类的指针,还有一个指向旨在保留这些类而不知道它们的类的指针。

因此,在容器类中,我实现了:

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个类制作模板?

如果您忘记了returnGetData() 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(); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM