C++11 "auto"到非 C++11 编译器

C++11 "auto" to an non C++11 compiler

本文关键字:C++11 编译器 auto 到非      更新时间:2023-10-16

我已经从

下载了源代码http://matt.eifelle.com/2012/07/17/just-a-small-example-of-numerical-optimization-in-c/

并尝试在g++ 4.4.6中编译,它不知道以下源代码的auto:

  auto optimizer = Optimization::Local::build_simplex( 
  fun,
  Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations),
      Optimization::Local::RelativeValueCriterion<float>(ftol))); 

阅读网页,我知道这是因为auto在c++ 11中支持,所以我试着搜索我下载的源代码,有一个simplex.h,它有以下源代码:

template<class Function, class Criterion>
static Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> build_simplex(const Function& fun, const Criterion& criterion)
{
  return Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion>(criterion);
}

然后我改变

auto optimizer  

Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer

或to

Optimization::Simplex<typename Function::DataType, typename Function::ParameterType, Function, Criterion> optimizer

none将通过编译器!!

我不太了解c++的模板用法,除了得到一个c++11编译,我应该为这个auto做哪些返回的数据类型修改?

更新:

谢谢你的帮助,我修改到int optimizer并编译,我得到:test_rosenbrock_simplex.cpp:44: error: cannot convert Optimization::Local::Simplex<float, Eigen::Matrix<float, 2, 1, 0, 2, 1>, Rosenbrock, Optimization::Local::AndCriteria<Optimization::Local::IterationCriterion, Optimization::Local::RelativeValueCriterion<float> > >int初始化

然后我把代码改成:

Optimization::Local::Simplex<float, Eigen::Matrix<float, 2, 1, 0, 2, 1>, Rosenbrock, Optimization::Local::AndCriteria<Optimization::Local::IterationCriterion, Optimization::Local::RelativeValueCriterion<float> > > optimizer

它工作!!!!!

g++ -O2 -march=native -msse2 -m64 -DEIGEN_NO_DEBUG test_rosenbrock_simplex.cpp-I/home/usrA/tools/eigen-eigen-5097c01bcdc4 -o test_rosenbrock_simplex.exe

。/test_rosenbrock_simplex.exe

-2.75  -0.5     0
2.1875 1.125     0
Starting point: 10
10
Starting value: 8181
Best point: 1
1
Best value: 5.68434e-14

您必须在实际的模板参数中替换,仅仅声明返回类型是不够的。

正如Drew在评论中提到的,你可以说服编译器告诉你这些。

简单地写

int optimizer = .....;

Boost有一个宏实现了类似c++11的自动功能。它叫做BOOST_AUTO

它看起来像:

BOOST_AUTO(optimizer, Optimization::Local::build_simplex(
    fun,
    Optimization::Local::make_and_criteria(Optimization::Local::IterationCriterion(max_iterations),
    Optimization::Local::RelativeValueCriterion<float>(ftol))); 

实际上,您要么使用Boost宏,要么自己编写完整的类型。很抱歉我没有把所有的东西都放进去,但我只会用c++ 11编译器来编写这个代码。否则,坚持使用非模板代码。(我是博客作者)。