无法命名的 C++ 类型

标签 c++ templates types c++11 decltype

阅读时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/

相关文章:

c - 在代码中修改 __FILE__ 和 __LINE__ 以供引用?

scala - Scala : Mixing traits with the “same” abstract type member

c++ - 在 C++ 中 ToString ("00.00000") 的等价物是什么?

c++ - 搜索日志文件

c++ - JSONCPP 附加到文件

c++ - 使用 qsql(c++ 和 qt)将数组(二进制数据)插入到 postgres 数据库中

c++ - 在两个不同的命名函数之间进行选择的特征有什么替代方法?

c++ - 嵌套模板和模板推断错误

generics - 如何将 "Encodable"绑定(bind)到类型参数?

c# - 如何从存储的运行时类型构建列表或数组类型以便进行比较?