有没有真正的案例证明'sizeof...'是必要的?

3

我想了解新运算符sizeof...的优势(与sizeof运算符不同)。我在网上搜索了一些例子,似乎都像下面这个例子:

template<class... ArgTypes>
std::size_t GetLength()
{
    return sizeof...(ArgTypes);
}

我认为这些例子不是很具有说明性。

有没有真实的例子可以说明sizeof...非常有用?

更新:

我在这里找到另外一些例子,看起来更有意义:

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;
}

2
sizeof...(T) 提供了实际的功能。当然,它可以与语言的其余部分一起实现,并且看起来像 size_of<T...>(),但内置它并不会有任何损失(它提供了更好的性能机会,并且不添加新关键字)。 - R. Martinho Fernandes
1
我对你所说的“更多”指的是什么感到困惑。比什么更优雅?比什么更富有表现力?我知道计算参数包中元素数量的另一种方法是使用递归元函数... - PlasmaHH
1
@LuchianGrigore:只需查看任何类型的可变参数索引扩展代码。任何接受包并执行类似于for-each或get<I>...的操作的内容。 - Kerrek SB
1
@NikosC。如果没有sizeof...,我期望使用类似于各种类型的以下内容:template<typename... Ts> struct sizeer{enum{value=0};}; template<typename T, typename... Ts> struct sizer<T, Ts...>{enum{value=1+sizer<Ts...>::value};};。请注意,它需要O(N)递归深度才能找到N个参数列表的大小,而sizeof...则在O(1)深度中完成。至于sizeof...的用途,每当您想要构建索引以将可变参数推入元组或提取相同的参数时,您最终都会使用它。 - Yakk - Adam Nevraumont
1
这里是一个例子... - Kerrek SB
显示剩余12条评论
3个回答

4

以下是我关于如何使用sizeof...的示例:

/// Transform a single boolean value into a number
constexpr unsigned int boolCode(bool value) {
    return value;
}

/// Transform a sequence of booleans into a number
template <typename... Args>
constexpr unsigned int boolCode(bool value, Args... others) {
    return value << sizeof...(others) | boolCode(others...);
}

这个便捷的函数可以在switch语句中使用,如下所示:

switch (boolCode(condition1, condition2, condition3)) {
case boolCode(false,false,false): //...
case boolCode(false,false,true): //...
case boolCode(false,true,false): //...
case boolCode(false,true,true): //...
case boolCode(true,false,false): //...
case boolCode(true,false,true): //...
case boolCode(true,true,false): //...
case boolCode(true,true,true): //...
}

2
您可能想阅读STL和CornedBee在评论中的讨论:http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-Cpp-8-of-n#comments 重要内容如下:
sizeof...不仅是一种语法糖。手动实现sizeof...将具有线性“运行时”(实例化数量),而内置的sizeof...为O(1)。(变参模板存在一个很大的问题,即由于无法随机访问参数包,编译速度往往非常慢。某个人(我认为来自Boost)对此进行了研究,并发现预处理器驱动的非变参元组Boost.Tuple的编译速度明显快于朴素的变参版本。)

-3

sizeof最初和首要的原因是在C++中引入它是因为它在C语言中存在,而在C语言中,为了知道要分配多少内存,例如malloc(n * sizeof(struct MyClass)),必须使用它。在C++中,它用于类似的情况,其中分配和初始化是分开的,例如在容器类、变量或类中。

它也被用于模板元编程,与函数重载解析一起使用。例如:sizeof(discriminatorFunction(someArgs)) == sizeof(TrueType)


7
该问题所涉及的是sizeof...而不是sizeof,它们是不同的概念(参考http://en.cppreference.com/w/cpp/language/sizeof...)。当前,该问题本身也不清楚,因为提问者没有说明他期望使用什么作为`sizeof...`的替代方案。 - Nikos C.
OP 的意思是 sizeof... 而不是 sizeof - David G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接