是否有任何真实案例证明'sizeof ......'是必要的?

时间:2013-02-19 14:59:30

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

我想知道新运算符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;
}

3 个答案:

答案 0 :(得分:3)

以下是您使用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): //...
}

答案 1 :(得分: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的编译速度(a   prerorcessor-powered non-variadic tuple)编译得很明显   比基于variadics的天真版本更快。)

答案 2 :(得分:-3)

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

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