没有元组的arduino参数包
arduino parameter pack working without tuple
我正在尝试制作可以 return 参数包的草图。我在这里找到了一个参考:
我将其修改为更加通用,并且可以return任何类型的对象指向 void 函数指针。
就是说,现在我正在使用 arduino DUE 进行测试,并且该板支持元组。但是arduino uno没有。
所以,基于这篇文章:
variadic data structure
我决定使用我自己的 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 callFunc(..),它是:
microTuple:72:73: error: expected primary-expression before ')' token
auto callFunc(seq<S...>) -> decltype(this->func(this->params.get<S>() ...))
^
params
的类型依赖于模板参数,所以编译器在解析时无法知道.get
是不是模板。你需要明确地告诉编译器它是一个模板:
auto callFunc(seq<S...>) -> decltype(this->func(this->params.template get<S>() ...))
我正在尝试制作可以 return 参数包的草图。我在这里找到了一个参考:
我将其修改为更加通用,并且可以return任何类型的对象指向 void 函数指针。
就是说,现在我正在使用 arduino DUE 进行测试,并且该板支持元组。但是arduino uno没有。
所以,基于这篇文章: variadic data structure 我决定使用我自己的 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 callFunc(..),它是:
microTuple:72:73: error: expected primary-expression before ')' token
auto callFunc(seq<S...>) -> decltype(this->func(this->params.get<S>() ...))
^
params
的类型依赖于模板参数,所以编译器在解析时无法知道.get
是不是模板。你需要明确地告诉编译器它是一个模板:
auto callFunc(seq<S...>) -> decltype(this->func(this->params.template get<S>() ...))