我有一些使用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
在编译时是已知的,因此您需要与编译器进行互操作。
.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版本非常相似,如果不是完全相同的话。