kir*_*kun 20 c++ templates types decltype c++11
在阅读维基百科关于decltype的页面时,我很好奇这个陈述,
其[decltype]的主要用途是在通用编程中,通常很难甚至不可能命名依赖于模板参数的类型.
虽然我可以理解该语句的难点部分,但是需要命名一个无法在C++ 03下命名的类型的示例是什么?
编辑:我的观点是,因为C++中的所有内容都有类型声明.为什么会出现无法命名类型的情况?此外,是不是设计用于产生类型信息的特质类?特质课可以替代decltype
吗?
Phi*_*ter 13
您链接的维基百科页面有一个完美的例子:
int& foo(int& i);
float foo(float& f);
template <class T> auto transparent_forwarder(T& t) ?> decltype(foo(t)) {
return foo(t);
}
Run Code Online (Sandbox Code Playgroud)
注意,foo(int&)
返回int&
(引用类型),而foo(float&)
返回float
(非引用类型).如果没有decltype
,则在模板中不可能指定一个表示"采用类型foo
参数的函数的返回t
类型T
" 的类型.
在这个例子中,它不是一个不可能表达的特定具体类型 - 无论是int&
或者float
可单独表达 - 而是更高级别的通用类类型.
编辑:并回答你对另一个答案的评论,这个例子在C++ 03中难以形容.你不能有一个函数模板,它将包装任何函数T1 foo(T2)
并匹配包装函数的参数和返回类型.
Jer*_*ock 11
C++ 0x中有类型(在C++ 03中,但不常见),无法明确命名,例如decltype(f)
声明后的类型auto f = [](int x) -> int {return x;};
.你需要typedef
的是decltype
结果的东西来获得一个名字都没有.Traits类可用于确定返回类型,但它们很混乱,并且用户需要使用traits类重载来复制它们的所有函数重载; 对于诸如函数(通过指针的隐式转换)应用于给定基类的所有子类的情况,这很难正确执行.
归档时间: |
|
查看次数: |
783 次 |
最近记录: |