在c++ 11中检索auto的类型而不执行程序



我有一些使用auto推断类型的c++ 11代码,我必须将其转换为c++ 98。我该如何转换代码,为auto的所有实例替换实际类型?

这将是一个PITA,但是您可以声明一个接受单个类型参数的不完整结构模板。

给定您想要知道的变量x的类型,您可以将结构体与decltype(x)一起使用,这将导致编译器错误,将显示推断的类型。

例如:

template<class Type> struct S;
int main() {
    auto x = ...;
    S<decltype(x)>();
}

现场演示

将产生一个错误消息,格式为:

error: implicit instantiation of undefined template 'S<X>' (clang++)
error: invalid use of incomplete type 'struct S<X>' (g++)

X为推断类型。在本例中,类型为int

小知识:这是Scott Meyer在最近的NDC 2014的一个视频中推荐的(我不记得是哪一个了)

由于auto在编译时是已知的,因此您需要与编译器进行互操作。

一个选择是Clang编译器的libtools库,它提供了静态分析工具的基础架构。例如,看看他们的重构示例代码,它从代码中删除了多余的.c_str()调用。我认为您可以编写一个类似的工具,将auto转换为推断类型。

您可以尝试在Boost类型库中使用BOOST_AUTO宏。

auto x = 5 + 7;

BOOST_AUTO(x,5+7);

可以使用typeid和std::type_info::name();

#include <iostream>
#include <typeinfo>
#include <complex>
int
main()
{
  using namespace std::literals::complex_literals;
  auto x = 3.1415F;
  std::cout << typeid(x).name() << 'n';
  auto z = 1.0 + 1.0i;
  std::cout << typeid(z).name() << 'n';
}
$ /home/ed/bin_concepts/bin/g++ -std=c++14 typeid.cpp 
$ ./a.out
f
St7complexIdE

这些名字并不漂亮,但你至少可以翻译它们。这些名字来自于g++。该名称依赖于编译器。有一些运动来标准化pretty_name()。下面是一种非标准的方式来解开这些名字。

另一种方法是使用函数模板和类型演绎。它可能不适用于所有示例,但在某些情况下可能会有所帮助:

int foo ()
{
   auto x = bar();
   // do something with 'x'
}

修改为:

template <typename T> int foo_(T x)
{
   // do something with 'x'
}
int foo ()
{
   foo_(bar());
}

auto是根据类型推导来指定的,所以上面的语义应该与c++ '11版本非常相似,如果不是完全相同的话。

相关内容

最新更新