gpt4 book ai didi

C++:函数模板指针的 std::vector

转载 作者:行者123 更新时间:2023-11-28 01:26:58 25 4
gpt4 key购买 nike

想法是循环调用类似的Runge-Kutta函数模板,而不是一个一个地调用。我看过类似的 solutions ,我也尝试了 void*,但由于转换错误无法应用于我的问题。

编辑:这些函数模板应该与固定类型一起使用,这是一种矫枉过正,但我​​想看看是否有是一个优雅的解决方案。

完整代码如下:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <functional>

template <typename X, typename F, typename H = double>
X runge_kutta1(const X &x, const F &f, H h)
{
return x + h * f(x);
}

template <typename X, typename F, typename H = double>
X runge_kutta2(const X &x, const F &f, H h)
{
X k1 = f(x);
return x + 0.5 * h * (k1 + f(x + h * k1));
}

struct pair
{
double v;
double w;

pair(double v, double w)
: v{v}, w{w}
{
}
};

inline pair operator*(double h, pair p)
{
return {h * p.v, h * p.w};
}

inline pair operator+(pair p1, pair p2)
{
return {p1.v + p2.v, p1.w + p2.w};
}

inline std::ostream &operator<<(std::ostream &stream, const pair &p)
{
stream << p.v << ", " << p.w;
return stream;
}

int main() {
{
double x = 0.0;
double x1 = 1.0;
double lambda = 2;
double h = 1.0E-3;
pair p{1.0 / lambda, 0.0};

const std::function<pair(pair)> cat =
[&lambda](const pair &p) { return pair{p.w, lambda * sqrt(1.0 + p.w * p.w)}; };
while (x + h < x1)
{
p = runge_kutta1(p, cat, h);
x = x + h;
}
p = runge_kutta1(p, cat, x1 - x);
pair expected = {cosh(lambda * x1) / lambda, sinh(lambda * x1)};
pair error = p + -1.0 * expected;

std::cout << std::setprecision(18) << "runge_kutta1:\nFinal result: " << p << "\n";
std::cout << "Error: " << error << "\n\n";
}

{
double x = 0.0;
double x1 = 1.0;
double lambda = 2;
double h = 1.0E-3;
pair p{1.0 / lambda, 0.0};

const std::function<pair(pair)> cat =
[&lambda](const pair &p) { return pair{p.w, lambda * sqrt(1.0 + p.w * p.w)}; };
while (x + h < x1)
{
p = runge_kutta2(p, cat, h);
x = x + h;
}
p = runge_kutta2(p, cat, x1 - x);
pair expected = {cosh(lambda * x1) / lambda, sinh(lambda * x1)};
pair error = p + -1.0 * expected;

std::cout << "runge_kutta2:\nFinal result: " << p << "\n";
std::cout << "Error: " << error << "\n";
}
}

我想要的(为了可读性简化了实际算法):

std::vector<?> functions{runge_kutta1, runge_kutta2}; // two just as an example
double p = 1.0;
double h = 1.0E-3;
double lambda = 2;
const std::function<pair(pair)> cat =
[&lambda](const pair &p) { return pair{p.w, lambda * sqrt(1.0 + p.w * p.w)}; };
for (const auto& func : functions) {
double t = func(p, cat, h);
std::cout << t << "\n";
}

最佳答案

您不能拥有指向函数模板的指针。您只能拥有指向模板特定实例化的指针。以同样的方式,您不能将模板打包到 std::function 中 - 只有它的特定实例。

并且您只能将相同类型的对象放入容器中 - 因此您的指针必须是相同类型(即它们指向的函数应该接受相同类型的参数并返回相同类型)。

std::function 将具有相同的限制 - 容器内的所有 std::functions 在返回值和参数方面必须属于同一类型。

关于C++:函数模板指针的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53343772/

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