【发布时间】:2013-02-04 07:33:48
【问题描述】:
我想知道新运算符sizeof... 的优点(不要与sizeof 运算符混淆)。我在网上搜索了一些示例,看起来都类似于以下示例:
template<class... ArgTypes>
std::size_t GetLength()
{
return sizeof...(ArgTypes);
}
我认为这些例子不是说明性的。
有没有实例说明sizeof...很有用?
更新:
我从here 中找到了另一个似乎更有意义的例子:
template<class ...A> void func(A ...args){
typedef typename common_type<A...>::type common;
std::array<common, sizeof...(A)> a = {{ args... }};
}
template<typename... A> int func(const A&... args)
{
boost::any arr[sizeof...(A)] = { args... };
return 0;
}
【问题讨论】:
-
sizeof...(T)提供实际功能。当然它可以用其他语言实现,看起来像size_of<T...>(),但是内置它并没有什么坏处(它提供了更好的性能机会并且没有添加新的关键字) -
我对您的“更多”指的是什么感到困惑。比什么更优雅?比什么更有表现力?我知道的计算参数包中元素数量的唯一其他方法是递归元函数......
-
@LuchianGrigore:看看任何类型的可变索引扩展代码。任何需要打包并且确实喜欢 for-each 或
get<I>...的东西.... -
@NikosC。
template<typename... Ts> struct sizeer{enum{value=0};}; template<typename T, typename... Ts> struct sizer<T, Ts...>{enum{value=1+sizer<Ts...>::value};};,与各种类型的类似,是我希望使用的,而不是sizeof...,如果它不存在的话。请注意,它需要 O(N) 递归深度才能找到 N 个参数列表的大小,而sizeof...则需要 O(1) 深度。至于sizeof...的使用,无论何时您想构建索引以将可变参数推入元组或提取相同的参数,您最终都会使用它。 -
这里是an example...
标签: c++ c++11 keyword sizeof variadic-templates