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

3 回答 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): //...
}
于 2013-02-21T12:17:03.740 回答
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(预处理器)的编译速度- 驱动的非可变元组)编译速度明显快于基于可变参数的朴素版本。)

于 2013-02-21T10:50:28.923 回答
-3

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

它也被用于模板元编程,与函数覆盖解析结合使用。类似的事情:sizeof( discriminatorFunction( someArgs ) ) == sizeof( TrueType )

于 2013-02-19T15:12:21.457 回答