参数包

来自cppreference.com
< cpp‎ | language
 
 
C++语言

|- class="t-nv-h1" | colspan="5" | 一般主题 |- | |- |

预处理器
注释

|

|-

|- class="t-nv-h1" | colspan="5" | 流程控制 |-

条件执行语句

| |- |

|

|-

循环语句

| |- |

|

|-

跳转语句

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 函数 |-

函数声明 Lambda函数声明 inline说明符 异常说明符 (已弃用) noexcept说明符 (C++11)

|- class="t-nv-h1" | colspan="5" | Exceptions |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 命名空间 |- | |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类型 |- | |- |

|

|-

说明符

| |- |

decltype (C++11)
auto (C++11)
alignas (C++11)

|

|-

存储持续期说明符 Initialization

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 表达式 |- | |- |

值类别
求值顺序

|

|-

替代表示 字面量 布尔型 - 整型 - 浮点型 字符型 - 字符串 - nullptr (C++11) 用户定义 (C++11)

|- class="t-nv-h1" | colspan="5" | Utilities |-

属性 (C++11) Types typedef声明 类型别名声明 (C++11) Casts 隐式类型转换 - 显示类型转换 static_cast - dynamic_cast const_cast - reinterpret_cast 内存分配

| |- |

|

|-

|- class="t-nv-h1" | colspan="5" | 类 |- | |- |

|

|-

类特有的函数属性

| |- |

|

explicit (C++11)
static

|-

静态成员函数

| |- |

|

|- |- class="t-nv-h1" | colspan="5" | 模板 |- | |- |

|

模板特化
参数包 (C++11)

|- |- class="t-nv-h1" | colspan="5" | 杂项 |- | |- |

|

|-

 

参数包是对变长模板参数以及展开到变长模板参数的变长函数参数的称呼。

目录

[编辑] 语法

class ... identifier (1) (since C++11)
identifier ... name (2) (since C++11)
name ... (3) (since C++11)

[编辑] 释义

1) 模板参数包声明。 模板的参数表包含一个可接受任意数量实参的参数。
2) 函数参数包声明。 函数的参数表包含一个可接受任意数量实参的参数。
3) 函数参数包展开式。 在函数体中展开为函数参数包的实参。

[编辑] 举例

#include <iostream>
 
void tprintf(const char* format) // base function
{
    std::cout << format;
}
 
template<typename T, typename... Targs>
void tprintf(const char* format, T value, Targs... Fargs) // recursive variadic function
{
    for ( ; *format != '\0'; format++ ) {
        if ( *format == '%' ) {
           std::cout << value;
           tprintf(format+1, Fargs...); // recursive call
           return;
        }
        std::cout << *format;
    }
}
 
int main()
{
    tprintf("% world% %\n","Hello",'!',123);
    return 0;
}

输出:

Hello world! 123

此例定义了一个类似于 std::printf 的函数,它将格式串中出现的每个字符%都替换为一个值。

如果只传递了格式串,那么会调用第一个重载形式,不存在参数展开的情况。

第二个重载形式包含一个单独的模板参数作为参数的开头,还包含一个参数包。我们可以递归调用本函数然后只传递参数包尾部的那个参数,直到参数包为空。

Targs 是模板参数包, Fargs 是函数参数包

[编辑] See also

function template
class template
sizeof... Queries the number of elements in a parameter pack.
C-style variadic functions
Preprocessor macros Can be variadic as well
来自“http://zh.cppreference.com/mwiki/index.php?title=cpp/language/parameter_pack&oldid=39907