【问题标题】:A Portable typeof() in C++ using SFINAE? [duplicate]使用 SFINAE 的 C++ 中的可移植 typeof()? [复制]
【发布时间】:2011-05-31 06:13:37
【问题描述】:

可能重复:
Absence of typeof operator in C++03?

是否可以在 pre-C++0x C++ 中使用模板可移植地获取表达式的编译时类型?

类似:

int foo() { return 0; } //Let's say we have this
typeof(foo()) x;        //x would now be of type 'int'

但由于我们使用的是模板,显然可能需要稍微不同的语法。

(我在这里和网络上的其他地方看到了许多重复项,但它们似乎依赖于编译器特定的功能或 C++0x(C++11?)decltype 功能。)

【问题讨论】:

  • @Kirill:那个副本使用 C++0x ......如果答案是“这是不可能的”,那么这就是我猜的答案。如果您有信心,请随时发布。 :)

标签: c++ templates typeof sfinae


【解决方案1】:

一般情况下是不可能的。是的,多年来已经为这个问题付出了很多努力。

有很多技巧可以确定表达式的类型在特定情况下(例如,函子通常用 typedef 进行注释,指示它们的返回类型),但一般,你需要decltype,这正是它被添加到 C++0x 中的原因。标准委员会遵循的政策是不添加核心语言功能来完成库本来可以完成的事情。

【讨论】:

  • +1,代表committee follows a policy of not adding core language features to do something a library could have done
【解决方案2】:

我不知道实现,但是看看Boost.Typeof

【讨论】:

  • Boost 需要注册所有类型。远非自动。
  • @Bo Persson:并非所有类型。例如,不是int& (*)(const volatile char*, double[5], void(*)(short))。当然不是int,就像这里的情况。
【解决方案3】:

不可能。您可以使用函数/方法执行的唯一编译时操作是sizeof(),这无助于推断类型(如typeid)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2016-09-08
    相关资源
    最近更新 更多