C++ 如何使用std::sqrt(boost::lambda::placeholder 1_类型)?

C++ 如何使用std::sqrt(boost::lambda::placeholder 1_类型)?,c++,c++11,boost,lambda,C++,C++11,Boost,Lambda,如何在boost::lambda::placeholder 1_类型上执行std::sqrt() 以下程序编译并执行良好。不知何故,它成功地将boost::lambda::_1转换为一个double并与5.0相乘 #include <boost/lambda/lambda.hpp> #include <iostream> #include <cmath> int main() { std::array<double, 6> a = {1,

如何在
boost::lambda::placeholder 1_类型上执行
std::sqrt()

以下程序编译并执行良好。不知何故,它成功地将
boost::lambda::_1
转换为一个double并与5.0相乘

#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <cmath>

int main() {

  std::array<double, 6> a = {1, 4, 9, 16, 25, 36};

  std::for_each(a.begin(), a.end(),
      std::cout << boost::lambda::_1 * 5.0 << " "
  );
}
编译器(g++)说

参数1从的转换未知 'boost::lambda::占位符1_类型{aka const boost::lambda::lambda_函子>}'到 “双人”

那么,在这个std::for_each循环中,如何从
boost::lambda::_1
中取平方根呢?

用C++11的方法:

#include <iostream>
#include <cmath>
#include <array>
#include <algorithm>

int main() {

  std::array<double, 6> a = {1, 4, 9, 16, 25, 36};

  std::for_each(a.begin(), a.end(),
      [] (const auto&v ) { std::cout << sqrt(v) * 5.0 << " "; }
  );
}
#包括
#包括
#包括
#包括
int main(){
数组a={1,4,9,16,25,36};
std::对于每个(a.begin(),a.end(),

[](const auto&v){std::cout您需要延迟调用
sqrt

注意:您需要使用强制转换来选择正确的
sqrt
重载

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <iostream>
#include <cmath>

int main()
{
    std::array<double, 6> a = {1, 4, 9, 16, 25, 36};

    std::for_each(a.begin(), a.end(),
        std::cout << boost::lambda::bind(static_cast<double(*)(double)>(std::sqrt), boost::lambda::_1) << " "
    );
}

啊,过去的好日子,波士德

int main() {

    std::array<double, 6> a = {1, 4, 9, 16, 25, 36};

    std::for_each(a.begin(), a.end(),
        std::cout << boost::lambda::bind(static_cast<double(*)(double)>(std::sqrt), boost::lambda::_1 * 5.0) << " "
    );
    return 0;
}
intmain(){
数组a={1,4,9,16,25,36};
std::对于每个(a.begin(),a.end(),

std::cout你认为boost::lambda::1在那里做什么?问题:当你有C++11时,为什么要使用boost.lambda?如果你想调用一个函数,那么你应该使用基于.Range的for循环,在这个用例中会更简单。它没有回答OP的问题。事实上,OP还标记了问题C++11。这让人很困惑ince boost::lambda旨在复制现在标准化的功能。
1 2 3 4 5 6 
int main() {

    std::array<double, 6> a = {1, 4, 9, 16, 25, 36};

    std::for_each(a.begin(), a.end(),
        std::cout << boost::lambda::bind(static_cast<double(*)(double)>(std::sqrt), boost::lambda::_1 * 5.0) << " "
    );
    return 0;
}