【发布时间】:2013-07-21 10:51:08
【问题描述】:
我目前正在尝试了解我可以通过可变参数模板支持做的一些事情。假设我有这样的功能 -
template <typename ... Args>
void foo(Args ... a)
{
int len = sizeof...(tail);
int vals[] = {a...};
/* Rest of function */
}
/* Elsewhere */
foo(1, 2, 3, 4);
此代码有效,因为我事先假设参数将是整数,但如果我提供其他内容显然会失败。如果我知道参数包将预先包含特定类型,是否有某种方法可以在没有模板的情况下完成并具有类似 -
void foo(int ... a)
我尝试过这样做,但编译器给出了一个错误,提示 foo 是一个 void 字段。我知道我也可以通过递归访问包中的参数,但我不确定这会解决我遇到的问题 - 即我希望能够采用可变数量的相同类型的参数。
【问题讨论】:
-
您可以使用
enable_if确保所有类型都是 ints。 -
如果你把它放入一堆整数,代码就可以工作。如果你给它别的东西,它就不起作用。看来任务完成了。问题出在哪里?
-
我想问题是是否有可能在编译时确保它们是整数。
-
A
static_assert也可以在这里工作,而不是enable_if。两者都使用来自<type_traits>的is_same。 -
@znby 如果
foo正文中的任何内容要求所有类型为ints 或可转换为ints - 例如int vals[] = {a...};- 如果你编写了一个它们不是的调用,那么你会在编译时知道这一点。
标签: c++ c++11 templates variadic-templates variadic-functions