Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检索C+中的自动类型+;11不执行程序_C++_C++11_Static Analysis - Fatal编程技术网

C++ 检索C+中的自动类型+;11不执行程序

C++ 检索C+中的自动类型+;11不执行程序,c++,c++11,static-analysis,C++,C++11,Static Analysis,我有一些C++11代码使用auto推断类型,我必须将其转换为C++98。如何转换代码,用实际类型替换auto的所有实例?由于编译时已知auto,因此需要与编译器进行互操作 一种选择是提供可作为静态分析工具基础的基础设施。 例如,查看它们删除代码中多余的.c_str()调用的方法。我认为您可以编写一个类似的工具,将auto转换为推断类型。您可以尝试在中使用BOOST\u auto宏 变成 BOOST_AUTO(x,5+7); 您可以使用typeid和std::type_info::name()

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

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

一种选择是提供可作为静态分析工具基础的基础设施。
例如,查看它们删除代码中多余的
.c_str()
调用的方法。我认为您可以编写一个类似的工具,将
auto
转换为推断类型。

您可以尝试在中使用
BOOST\u auto

变成

BOOST_AUTO(x,5+7);

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

#包括
#包括
#包括
int
main()
{
使用名称空间std::literals::complex_literals;
自动x=3.1415F;

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

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

例如:

template<class Type> struct S;

int main() {
    auto x = ...;
    S<decltype(x)>();
}
模板结构;
int main(){
自动x=。。。;
S();
}

将生成以下格式的错误消息:

error: implicit instantiation of undefined template 'S<X>' (clang++)
error: invalid use of incomplete type 'struct S<X>' (g++)
错误:未定义模板(clang++)的隐式实例化
错误:无效使用不完整的类型“struct S”(g++)
推断类型为
X
。在这种特殊情况下,类型为
int


琐事:Scott Meyer在最近的NDC 2014视频中推荐了这一点(我不记得是哪一个)。

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

int foo ()
{
   auto x = bar();
   // do something with 'x'
}
将此更改为:

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

int foo ()
{
   foo_(bar());
}
template int foo_ux)
{
//用“x”做点什么
}
int foo()
{
foo_u2;(bar());
}

<代码> Auto/<代码>是按类型推导的,因此,如果与C++ 11版本不一致,则应该具有非常相似的语义。

<代码> Auto <代码>是编译时,不是运行时。它是一个方便的特性,因此您可以从表达式中推断出该类型。如果这是困难的,只需用“类型”替换“代码>自动<代码> >您知道是错误的,请查看编译器的错误消息。“无法从“x”转换为“y”其中“x”是您的类型。如果您不介意我问的话,为什么要将其转换回?这是手动执行的一种方法,但我想自动执行此过程,但我不知道如何推断类型。我之所以要这样做,是因为我必须向编程竞赛提交解决方案的源代码,而且他们的系统只编译C++98。相关:@BryanChen:这是相似的,但他们的解决方案需要运行程序。有趣的是,如果我只运行预处理器,它将直接用文本类型替换表达式?或者它是否附带一些字符串,如decltype?@user1825464,据我所知,它应该可以工作。尽管您可能希望注意如何声明
const auto x
。请参阅这个问题当使用标准库中的容器时,这种方法会变得非常棘手。请检查。这仅在编译器实现
decltype
时有效,这同样是一个C++11扩展。C++11之前的编译器实现此功能的方式多种多样,如
typeof
(GCC,Clang)或
decltype
(MSVC)但与标准化的语义不完全相同。
int foo ()
{
   auto x = bar();
   // do something with 'x'
}
template <typename T> int foo_(T x)
{
   // do something with 'x'
}

int foo ()
{
   foo_(bar());
}