我没有编译器来测试这些,所以你必须报告任何问题。
以下应该允许您迭代调用函数的元组。它基于您的逻辑,并进行了一些细微的更改。 (N
is a std::size_t
,这是第一个允许的参数Args
(and Func
)在进一步的调用中推断,它只是调用一些函数而不是执行特定的任务)。没有什么太激烈的:
namespace detail
{
// just to keep things concise and readable
#define ENABLE_IF(x) typename std::enable_if<(x)>::type
// recursive case
template <std::size_t N, typename... Args, typename Func>
ENABLE_IF(N >= 1) iterate(const std::tuple<Args...>& pTuple, Func& pFunc)
{
pFunc(std::get<N - 1>(pTuple));
iterate<N - 1>(pTuple, pFunc);
}
// base case
template <std::size_t N, typename... Args, typename Func>
ENABLE_IF(N == 0) iterate(const std::tuple<Args...>&, Func&)
{
// done
}
}
// iterate tuple
template <typename... Args, typename Func>
Func iterate(const std::tuple<Args...>& pTuple, Func pFunc)
{
detail::iterate<sizeof...(Args)>(pTuple, pFunc);
return pFunc;
}
假设一切正常,那么您将拥有:
struct push_lua_stack
{
// constructor taking reference to stack to push onto
// initialize count to 0, etc....
template <typename T>
void operator()(const T& pX)
{
// push pX onto lua stack
++count;
}
std::size_t count;
};
最后:
std::size_t pushCount = iterate(someTuple, push_lua_stack()).count;
让我知道这一切是否有意义。
由于出于某种原因,您似乎真的非常反对结构,因此只需创建一个如下所示的函数:
template <typename T>
void push_lua(const T& pX)
{
// push pX onto lua stack
}
并更改所有内容以专门调用该函数:
namespace detail
{
// just to keep things concise and readable
#define ENABLE_IF(x) std::enable_if<(x)>::type* = nullptr
// recursive case
template <std::size_t N, typename... Args>
typename ENABLE_IF(N >= 1) iterate(const std::tuple<Args...>& pTuple)
{
// specific function instead of generic function
push_lua(std::get<N - 1>(pTuple));
iterate<N - 1>(pTuple);
}
// base case
template <std::size_t N, typename... Args, typename Func>
typename ENABLE_IF(N == 0) iterate(const std::tuple<Args...>&, Func&)
{
// done
}
}
// iterate tuple
template <typename... Args>
void _push(const std::tuple<Args...>& pTuple)
{
detail::iterate<sizeof...(Args)>(pTuple);
}
不知道为什么你会避免通用功能,或者如此反对结构。
哦,多态 lambda 会多好啊。放弃公用事业push_lua_stack
类并只写:
std::size_t count = 0;
iterate(someTuple, [&](auto pX)
{
// push onto lua stack
++count;
});
Oh well.