受到我上一个问题的启发:制作可变参数函数,它接受任意函子并返回输入函子的每个返回值的元组 https://stackoverflow.com/questions/15059250/make-variadic-function-which-takes-arbitary-functors-and-returns-a-tuple-of-each
现在,我想创建一个类,它只执行每个可能返回 void 的函数对象。
据我所知,我可以做一些类似的事情,
class A
{
public:
template <class Func>
void operator()(Func func)
{
func();
}
template <class First, class... Funcs>
void operator()(First first, Funcs... funcs)
{
first();
operator()(funcs...);
}
};
这段代码完成了这项工作。
但是,我想一定有更聪明的方法,比如代码Nawaz
and mfontanini
在上面的链接中。
我在下面尝试模仿他们的代码。
class A
{
public:
template <class... Func>
void operator()(Func func...)
{
func()...;
}
};
但是,gcc 4.7.2 无法编译。我在这里失踪了吗?
为了扩展纳瓦兹的答案,你需要一定的context执行包扩展 - 它不能随处完成。其中一个上下文是函数参数,另一个上下文是任何类型的初始化。
The sink
Nawaz 给出的函数是一个很好的起点,但它有一个严重的缺陷——你没有保证函子执行的顺序。如果您希望用户能够依赖他们传递给您的顺序,则需要一个确保从左到右评估的上下文。数组初始化和列表初始化都适合这里。
使用数组初始化:
template <class... Func>
void operator()(Func func...)
{
int ignored[] = { (func(),0)... };
(void)ignored; // silence unused variable warnings
}
使用列表初始化:
struct swallow{
template<class... Ignored>
swallow(Ignored&&...)
};
template <class... Func>
void operator()(Func func...)
{
swallow{ (func(),0)... }; // create a temporary 'swallow' from all arguments
}
The (func(), 0)
部分只是执行func
,丢弃返回值(如果有),然后计算为0
.
通常,如果您想对任何函子执行此操作,无论返回类型如何,并丢弃结果,您可以将其写为(void(func()), 0)...
. The void(...)
部分吞掉任何返回值func()
, 如果有什么。这是必要的,因为允许用户超载operator,
,并可能决定为自己的类型这样做,并且int
(文字类型0
),这会破坏你的努力。但是,你不能超载operator,
with void
在任何一边。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)