use*_*567 111 c++ decltype auto c++11
我找到了这样的代码:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
我想到了所有细节,这对我来说是新的,但只有一个.请告诉我,在哪里可以阅读,箭头操作符(->)在函数标题中的含义是什么?我纯粹从逻辑上说,那个->算子确定了一个类型,auto但是我希望得到这个,但找不到信息.
Jan*_*dec 177
在C++ 11中,函数声明有两种语法:
返回类型 标识符 ( 参数声明... )
和
auto 标识符 ( 参数声明... ) -> return_type
它们是等价的.现在当它们相同时,你为什么要使用后者呢?好吧,C++ 11引入了这个很酷的decltype东西,可以让你描述一个表达式的类型.因此,您可能希望从参数类型派生返回类型.所以你试试:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
Run Code Online (Sandbox Code Playgroud)
并且编译器会告诉你它不知道参数中的内容a和内容.那是因为它们只是由参数列表声明.bdecltype
您可以通过使用declval已声明的模板参数轻松解决此问题.喜欢:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
Run Code Online (Sandbox Code Playgroud)
除了它现在变得非常冗长.因此,提出并实现了备用声明语法,现在您可以编写
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
Run Code Online (Sandbox Code Playgroud)
并且它不那么冗长,并且范围规则不需要改变.
C++ 14更新: C++ 14也允许
auto 标识符 ( 参数声明... )
只要函数在使用前完全定义,并且所有return语句都推导为相同类型.的->,如果你要隐藏的身体在源文件中的语法仍然是公共职能(在头部声明)是有用的.显然有些模板无法完成,但有一些具体的类型(通常是通过模板元编程推导出来的),否则难以编写.
除了decltype和declval的使用之外,您还可以使用类中定义的返回类型来定义类成员函数,而无需Class::再次提供范围解析前缀。
例子:
class SomeLongClassname
{
public:
typedef std::shared_ptr<Node> PNode;
PNode make_node ();
};
Run Code Online (Sandbox Code Playgroud)
选择:
SomeLongClassname::PNode SomeLongClassname::make_node () { ... }
Run Code Online (Sandbox Code Playgroud)
或者
auto SomeLongClassname::make_node () -> PNode { ... }
Run Code Online (Sandbox Code Playgroud)
第二种形式有时更清晰。
| 归档时间: |
|
| 查看次数: |
29298 次 |
| 最近记录: |