Псевдоним шаблона для функции с переменным числом аргументов - PullRequest
0 голосов
/ 08 октября 2018

У меня есть шаблон класса 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 голосов
/ 08 октября 2018

Другой вариант, без 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 *;
0 голосов
/ 08 октября 2018

С дополнительным слоем вы можете сделать:

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.

...