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