自动 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 制作我的模板?
如果忘记了return
在GetData()
,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(); }
我在代码的各个模块中有多个数据 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 制作我的模板?
如果忘记了return
在GetData()
,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(); }