gpt4 book ai didi

c++ - 模板参数简化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:15 25 4
gpt4 key购买 nike

我是 C++ 的新手(使用 C++ 2011),我想找到以下问题的解决方案。我有一个代表函数的类:

class Curve {
private:
...
public:
std::array<double, 3> value(double s);
}

我正在使用该对象将此函数传递给由类表示的算法:

template <int n, typename Functor>
class Algorithm {
private:
Functor f;
std::array<double, n> a;
public:
...
}

然后我创建对象

Algorithm<3, Curve> solver;

但是 3 显然是来自任何 Curve 类型对象的方法值返回的数组大小的 3。我想简化这段代码,以便我可以使用:

Algorithm<Curve> solver;

但我不知道该怎么做。你介意给我一个提示吗?

最好的问候,弗朗索瓦

最佳答案

添加成员 array_length 或类似 Curve 类的东西:

class Curve
{
public:
static constexpr const std::size_t length = 3;

private:
std::array<double,length> a;
};

template<typename ALGORITHM , std::size_t n = ALGORITHM::length>
class Algorithm
{
...
};

如果您需要允许经典函数实体作为算法,则该方法不起作用,因为没有 length 成员。其他方法可能是创建一个元函数 data_length给定一个算法函数 F 返回数据的长度:

template<typename F>
struct length;

//Specialization for Curve class:
template<>
struct length<Curve> : public std::integral_constant<std::size_t,3>
{};

然后:

template<typename F , std::size_t n = length<F>::value>
struct Algorithm
{
...
};

编辑: 与任何其他模板一样,要实现该方法,请指定其模板参数:

template<typename F , std::size_t N>
void Algorithm<F,N>::execute()
{
_f();
}

Here是一个运行的例子。

关于c++ - 模板参数简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24448660/

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