gpt4 book ai didi

c++ - 如何使用 std::sqrt 作为 std::function?

转载 作者:行者123 更新时间:2023-12-04 14:36:41 32 4
gpt4 key购买 nike

这是代码:

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

int main() {
// This works.
std::function<float(float)> f = [](auto const& x) {return std::sqrt(x);};

// This also works. Why this works?!
using Complex = std::complex<double>;
std::function<Complex(const Complex&)> g = std::sqrt<double>;

// All of the following doesn't work.
// error: conversion from ‘<unresolved overloaded function type>’
// to non-scalar type ‘std::function<float(float)>’ requested
std::function<float(float)> a = std::sqrtf<float>;
std::function<float(float)> b = std::sqrt<float>;
std::function<float(float)> c = std::sqrt;
std::function<double(double)> d = std::sqrt<double>;
}
考虑到 std::sqrt reference ,我真的很困惑为什么一个涉及复杂的作品,为什么其他的不起作用。
我知道 this question ,但是,我对使用 std::complex 不感兴趣,并且,来自这个问题的 OP 特别要求 std::complex ,相反,我只想与 float 一起工作或 double (或实值,不复杂)。
这是怎么回事?
这样做的正确方法是什么?

最佳答案

std::sqrt() 的浮点重载和 std::sqrtf()不是模板,所以这些形式是无效的语法:

std::function<float(float)> a = std::sqrtf<float>;
// and
std::function<double(double)> d = std::sqrt<double>;
这种形式:
std::function<float(float)> c = std::sqrt;
没问题,除了 std::sqrt()已重载,因此名称不能像未重载时那样衰减为单个指针。
为了消除使用哪个重载的歧义,您需要将函数强制转换为正确的类型:
std::function<float(float)> works = static_cast<float(*)(float)>(std::sqrt);
但是正如您所看到的,语法有点冗长,这就是为什么 lambda 版本是执行此操作的首选方式。
此表单有效的原因:
std::function<Complex(const Complex&)> g = std::sqrt<double>;
是因为 std::complex std::sqrt() 的版本是一个模板,其中模板参数是复杂对象的基础类型。

关于c++ - 如何使用 std::sqrt 作为 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68956856/

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