【发布时间】:2010-07-23 08:36:52
【问题描述】:
我有一个名为_push 的函数,它可以处理不同的参数,包括元组,并且应该返回推送元素的数量。
例如,_push(5) 应将“5”压入堆栈(stack of lua)并返回 1(因为压入了一个值),而 _push(std::make_tuple(5, "hello")) 应压入“5”和“hello”并返回 2 .
我不能简单地用_push(5, "hello") 替换它,因为我有时会使用_push(foo()),我想让foo() 返回一个元组。
无论如何我无法让它与元组一起工作:
template<typename... Args, int N = sizeof...(Args)>
int _push(const std::tuple<Args...>& t, typename std::enable_if<(N >= 1)>::type* = nullptr) {
return _push<Args...,N-1>(t) + _push(std::get<N-1>(t));
}
template<typename... Args, int N = sizeof...(Args)>
int _push(const std::tuple<Args...>& t, typename std::enable_if<(N == 0)>::type* = nullptr) {
return 0;
}
假设您要推送tuple<int,bool>。这就是我期望它的工作方式:
-
_push<{int,bool}, 2>被调用(第一个定义) -
_push<{int,bool}, 1>被调用(第一个定义) -
_push<{int,bool}, 0>被调用(第二个定义)
但是使用 g++ 4.5(我拥有的唯一支持可变参数模板的编译器),我收到一个关于 _push<Args...,N-1>(t)(第 3 行)的错误,说它找不到要调用的匹配函数(没有任何进一步的细节)。我试过不带“...”,但我收到另一个错误,说参数包没有展开。
我该如何解决这个问题?
PS:我知道你可以使用模板结构来做到这一点(这实际上是我之前所做的),但我想知道如何使用函数来做到这一点
PS2:PS2 已解决,感谢 GMan
【问题讨论】:
-
我对你的目标感到困惑。无论如何,对于 PS2,您需要
sizeof...(Args),它返回包中的参数数量。 -
谢谢;我的目标很简单:我想将元组中的所有元素一个一个地推送,而不必为此专门创建一个结构;我认为可以像我在我的问题中那样做,但 g++ 不这么认为
-
我听不懂你的动词“push”。介意假装这些函数工作,然后给出一些输入和输出的例子吗?
-
事实上这是一个围绕 lua 的包装器(具有高级特性),“push”应该将一个值压入 lua 的堆栈; push(5) 或 push("hello") 应该返回 1,push(std::make_tuple(5, "hello")) 应该返回 2
-
@tomaka:无论如何要把那种东西存进去?返回值有什么意义?恐怕没有例子,我至少无法很好地掌握“推”。 (不过我对 Lua 很熟悉。)你的目标是什么? (形式为:“致电
push(...),让___发生。”