【问题标题】:Are there any real cases proving that 'sizeof...' is necessary?是否有任何真实案例证明'sizeof ...'是必要的?
【发布时间】: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&lt;T...&gt;(),但是内置它并没有什么坏处(它提供了更好的性能机会并且没有添加新的关键字)
  • 我对您的“更多”指的是什么感到困惑。比什么更优雅?比什么更有表现力?我知道的计算参数包中元素数量的唯一其他方法是递归元函数......
  • @LuchianGrigore:看看任何类型的可变索引扩展代码。任何需要打包并且确实喜欢 for-each 或 get&lt;I&gt;... 的东西....
  • @NikosC。 template&lt;typename... Ts&gt; struct sizeer{enum{value=0};}; template&lt;typename T, typename... Ts&gt; struct sizer&lt;T, Ts...&gt;{enum{value=1+sizer&lt;Ts...&gt;::value};};,与各种类型的类似,是我希望使用的,而不是 sizeof...,如果它不存在的话。请注意,它需要 O(N) 递归深度才能找到 N 个参数列表的大小,而 sizeof... 则需要 O(1) 深度。至于sizeof... 的使用,无论何时您想构建索引以将可变参数推入元组或提取相同的参数,您最终都会使用它。
  • 这里是an example...

标签: c++ c++11 keyword sizeof variadic-templates


【解决方案1】:

这是我可以用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】:

    您可能想阅读 cmets 中 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的编译速度(a 预处理器驱动的非可变元组)显着编译 比简单的基于可变参数的版本更快。)

    【讨论】:

      【解决方案3】:

      sizeof 被引入 C++ 的首要原因 是因为它存在于 C 中,在此有必要按顺序 知道要分配多少内存,例如malloc( n * sizeof(struct MyClass) )。在 C++ 中,它以类似的方式使用 在分配和初始化是分开的情况下,对于 容器类、变体或类中的示例。

      它也被用于模板元编程,在 结合功能覆盖分辨率。沿线的事情 行:sizeof( discriminatorFunction( someArgs ) ) == sizeof( TrueType )

      【讨论】:

      • 问题指的是sizeof...,而不是sizeof。这些是不同的东西(en.cppreference.com/w/cpp/language/sizeof...)而且现在的问题还不清楚,因为 OP 没有说明他期望什么可以替代sizeof...
      • OP 的意思是 sizeof... 而不是 sizeof
      猜你喜欢
      • 2013-11-21
      • 2021-12-10
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 2019-06-14
      • 2013-05-02
      • 1970-01-01
      相关资源
      最近更新 更多