3

我有一个类模板 Foo,它有几个成员,其中一个是 Bar 类型的函数 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应该指定函数 bar 采用的双参数的数量。

我设法接近这种行为的唯一方法是使用模板别名

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

但是,通过这种方式,我不能bar以自然的方式调用该函数bar(x,y,z)

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

4

2 回答 2

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 中实现。

于 2018-10-08T15:17:31.123 回答
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 *;
于 2018-10-08T18:17:42.330 回答