gpt4 book ai didi

c++ - 如何在 std::function 中存储 std::sqrt

转载 作者:行者123 更新时间:2023-12-02 02:15:59 25 4
gpt4 key购买 nike

std::sqrt() 类型为std::complex<T>(const std::complex<T>&) 。为什么我不能将其存储在这个std::function中?我得到的错误是:

error: conversion from ‘’ to non-scalar type ‘std::function(const std::complex&)>’ requested

Run it here:

#include <complex>
#include <functional>
#include <iostream>

int main(){
using Complex = std::complex<double>;
std::function<Complex(const Complex&)> f = std::sqrt;
std::cout << "sqrt(4): " << f(std::complex<double>(4,0)) << "\n";
return 0;
}

最佳答案

关于代码中的行:

std::function<Complex(const Complex&)> f = std::sqrt;

您必须考虑到std::sqrt() 不是普通函数,而是函数模板:

template<class T>
complex<T> sqrt(const complex<T>& z);

您根据std::complex定义了Complex类模板:

using Complex = std::complex<double>;

由于 std::complex 包含与传递的模板参数对应的成员类型 value_type(即,在本例中为 double ),您可以这样做:

std::function<Complex(const Complex&)> f = std::sqrt<Complex::value_type>;

这相当于直接将 double 作为模板参数传递给 std::sqrt():

std::function<Complex(const Complex&)> f = std::sqrt<double>;

但是,前者比后者更通用,因为它允许您更改 std::complex 的模板参数 - 例如,使用 int float 而不是 double – 无需编辑与作业相对应的源代码。

<小时/>

自 C++14 起,您还可以通过通用 lambda 包装对 std::sqrt() 的调用,并将此 lambda 分配给 std::function 对象:

std::function<Complex(const Complex&)> f = [](auto const& x) { 
return std::sqrt(x);
};

关于c++ - 如何在 std::function 中存储 std::sqrt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60547115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com