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

标签 c++ templates

想法是循环调用类似的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/

相关文章:

c++ - 标题中的缩进成员

c++ - 固定尺寸表

将函数转换为函数对象类型的 C++ 模板

c++ - 从静态成员函数推断类模板参数的模式

c++ - 使用T的默认构造函数作为默认初始值

android - 如何使用头文件正确设置动态库加载?

c++ - 在泛型类中实现特定方法

c# - 在 IIS7 中从 ASP.NET 调用非托管代码

c++ - 嵌套模板类型

c++ - 使用模板时获取 "Trigger Breakpoint Error at delete"