模板参数简化

Ins*_*oop 4 c++ templates

我是C++的新手(使用C++ 2011),我想找到解决以下问题的方法.我有一个代表一个功能的类:

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

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

template <int n, typename Functor>
class Algorithm {
private:
    Functor f;
    std::array<double, n> a;
public:
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了对象

Algorithm<3, Curve> solver;
Run Code Online (Sandbox Code Playgroud)

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

Algorithm<Curve> solver;
Run Code Online (Sandbox Code Playgroud)

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

最好的问候,弗朗索瓦

Man*_*726 8

添加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
{
    ...
};
Run Code Online (Sandbox Code Playgroud)

如果您需要允许经典函数实体作为算法,那么这种方法不起作用,因为没有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>
{};
Run Code Online (Sandbox Code Playgroud)

然后:

template<typename F , std::size_t n = length<F>::value>
struct Algorithm
{
   ...
};
Run Code Online (Sandbox Code Playgroud)

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

template<typename F , std::size_t N>
void Algorithm<F,N>::execute()
{
    _f();
}
Run Code Online (Sandbox Code Playgroud)

是一个运行的例子.