Пакет параметров Arduino работает без кортежа - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь сделать эскиз, который может вернуть пакет параметров. Я нашел ссылку здесь: кортеж для пакета параметров

Я изменяю его, чтобы он был еще более обобщенным c и мог возвращать любой тип объекта в указатель на функцию void.

Тем не менее, сейчас я тестирую с Arduino DUE и кортежем этой платы. Но arduino uno этого не делает.

Итак, основываясь на этой статье: variadi c структура данных Я решил использовать свою собственную структуру данных микрот кортежей, которая будет поддерживаться UNO , Структура работает сама по себе.

Вот код пока:

#include <tuple>

template<size_t idx, typename T>
struct microTupleGetHelper;

template<typename ... T>
struct microTuple
{
};

template<int ...> struct seq {};

template<int N, int ...S> struct gens : gens<N - 1, N - 1, S...> { };

template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };



template<typename T, typename ... Rest>
struct microTuple<T, Rest ...>
{
microTuple(const T& first, const Rest& ... rest)
    : first(first)
    , rest(rest...)
{}

T first;
microTuple<Rest ... > rest;

template<size_t idx>
auto get() ->  decltype(microTupleGetHelper<idx, microTuple<T,Rest...>>::get(*this))
{
    return microTupleGetHelper<idx, microTuple<T,Rest...>>::get(*this);
}
};

template<typename T, typename ... Rest>
struct microTupleGetHelper<0, microTuple<T, Rest ... >>
{
    static T get(microTuple<T, Rest...>& data)
    {
        return data.first;
    }
};

template<size_t idx, typename T, typename ... Rest>
struct microTupleGetHelper<idx, microTuple<T, Rest ... >>
{
    static auto get(microTuple<T, Rest...>& data) ->  decltype(microTupleGetHelper<idx-1, 
microTuple<Rest ...>>::get(data.rest))
    {
        return microTupleGetHelper<idx-1, microTuple<Rest ...>>::get(data.rest);
    }
};



template <typename ...Args>
struct paramsPack
{
//std::tuple<Args...> params;
microTuple<Args...> params;

void (*func)(Args...);

/*    template<int ...S>
auto callFunc(seq<S...>) -> decltype(this->func(std::get<S>(this->params) ...))
{
    return func(std::get<S>(params) ...);
}*/

template<int ...S>
auto callFunc(seq<S...>) -> decltype(this->func(this->params.get<S>() ...))
{
    return func(params.get<S>() ...)
}

auto delayed_dispatch() -> decltype(this->callFunc(typename gens<sizeof...(Args)>::type()))
{
    return this->callFunc(typename gens<sizeof...(Args)>::type()); // Item #1
}

};

ошибка приходит в auto callFun c (..), она стоит:

microTuple:72:73: error: expected primary-expression before ')' token

 auto callFunc(seq<S...>) -> decltype(this->func(this->params.get<S>() ...))

                                                                     ^

1 Ответ

1 голос
/ 02 февраля 2020

Тип params зависит от параметров шаблона, поэтому компилятор не может узнать, является ли .get шаблоном или нет при его синтаксическом анализе. Вы должны явно указать компилятору, что это шаблон:

auto callFunc(seq<S...>) -> decltype(this->func(this->params.template get<S>() ...))
...