我有一个具有多个成员的类模板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)
。
是否有可能得到我想要的行为?
答案 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 *;