【问题标题】:How can I std::sqrt(boost::lambda::placeholder1_type)?我怎样才能 std::sqrt(boost::lambda::placeholder1_type)?
【发布时间】:2017-12-09 08:33:02
【问题描述】:

我如何在boost::lambda::placeholder1_typestd::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 << " "
  );
}

但是,如果我将 std::cout 行替换为

std::cout << std::sqrt(boost::lambda::_1) << " "

编译器 (g++) 说

参数 1 的未知转换来自 'boost::lambda::placeholder1_type {aka const boost::lambda::lambda_functor >}' 到 ‘双’

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

【问题讨论】:

  • 你认为 boost::lambda::_1 在那里做什么?
  • 问题:当您拥有 C++11 时,为什么还要使用 Boost.Lambda?
  • 如果你想调用一个函数,那么看来你应该使用bind expression

标签: c++ c++11 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 << " "; }
  );
}

【讨论】:

  • 对于这个用例来说,基于范围的 for 循环会更简单。
  • 它没有回答 OP 的问题。
  • 确实,但 OP 也标记了问题 C++11。这很令人困惑,因为 boost::lambda 旨在复制现在标准化的功能。
【解决方案2】:

您需要延迟sqrt 的通话。为此,您应该使用 bind expression.

注意:您需要使用强制转换来选择正确的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) << " "
    );
}

输出:

1 2 3 4 5 6 

Live Sample

【讨论】:

    【解决方案3】:

    啊,Boost.Lambda 的美好时光

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      相关资源
      最近更新 更多