具有不同数量参数的函数的模板别名

时间:2018-10-08 15:12:07

标签: c++ c++11 templates alias template-aliases

我有一个具有多个成员的类模板Foo,其中一个是Bar类型的功能栏:

template<std::size_t N>
class Foo
{
    ...
    Bar<N> bar;
    ...
};

我希望Bar<2>是函数double (* )(double, double)(或者可能是std::function<double(double, double)>)的模板别名。同样,我希望Bar<3>是函数double (* )(double, double, double)(或者可能是std::function<double(double, double, double)>)的模板别名。这意味着N应指定功能栏采用的双参数个数。

我设法做到这一点的唯一方法就是使用模板别名

template <std::size_t N>
using Bar = double (* )(std::array<double, N>& eval);

但是,以这种方式,我无法以自然的方式bar调用函数bar(x,y,z)

是否有可能得到我想要的行为?

2 个答案:

答案 0 :(得分:4)

通过额外的层,您可以这样做:

template <typename T>
struct BarHelper;

template <std::size_t ... Is>
struct BarHelper<std::index_sequence<Is...>>
{
private:
    template <std::size_t, typename T>
    using always_t = T;
public:
    using type = double (*) (always_t<Is, double>...);
};

template <std::size_t N>
using Bar = typename BarHelper<std::make_index_sequence<N>>::type;

std::index_sequence是C ++ 14,但可以在C ++ 11中实现。

答案 1 :(得分:1)

另一个没有index_sequence的选项:

template<class T> 
struct add_double_arg;

template<class R,class...Args>
struct add_double_arg<R(Args...)>{
    using type = R(Args...,double);
};

template<int N,template<class> class Transform,class Init>
struct repeat{
    using type = typename Transform<
           typename repeat<N-1,Transform,Init>::type
                  >::type;
};
template<template<class> class Transform,class Init>
struct repeat<0,Transform,Init>{
    using type = Init;
};

template<int N>
using Bar = typename repeat<N,add_double_arg,double()>::type *;