阅读时Wikipedia's page on decltype ,我很好奇这个说法,
Its [decltype's] primary intended use is in generic programming, where it is often difficult, or even impossible, to name types that depend on template parameters.
虽然我可以理解该语句的困难部分,但有什么示例需要命名在 C++03 下无法命名的类型?
编辑:我的意思是,因为 C++ 中的所有内容都有类型声明。为什么会出现无法命名类型的情况?此外,特征类不是旨在产生类型信息吗?特征类可以替代 decltype
吗?
最佳答案
你链接的维基百科页面有一个完美的例子:
int& foo(int& i);
float foo(float& f);
template <class T> auto transparent_forwarder(T& t) −> decltype(foo(t)) {
return foo(t);
}
注意 foo(int&)
返回 int&
(引用类型),而 foo(float&)
返回 float
(非引用类型)。如果没有 decltype
,就不可能在模板中指定一个类型,该类型表示“函数 foo
的返回类型,该类型的参数为 t
T
".
在这个例子中,它不是一个无法表达的特定具体类型——int&
或float
都可以单独表达——而是更高级别的泛型类型。
编辑:并回答您对另一个答案的评论,这个例子在 C++03 中是无法表达的。你不能有一个函数模板来包装任何函数 T1 foo(T2)
并匹配被包装函数的参数和返回类型。
关于无法命名的 C++ 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5207332/