c++ - 我可以区分一个和多个参数吗?

标签 c++ c++11 printf variadic-functions

C++11 或 C++14 中是否有任何新功能使我们不必再使用:

TRACE0("one-string-no-args");  

TRACE("formatting string with one-or-more args", arg1, arg2, etc);  

此类函数必须通过名称加以区分,因为据我所知,重载无法区分零附加参数情况与一个或多个参数情况。

这对于 printf 风格的接口(interface)当然很重要,能够知道不再有参数意味着您可以通过不尝试将格式化字符串解释为格式化来避免一类错误字符串,但仅作为最终输出字符串。

最佳答案

您可能只是不知道该功能的名称:variadic templates .

它的主要用途是从可变数量的参数中推导出可变数量的类型;你可以将它全部存储在某个地方(比如 std::make_tuple()),或者只是打开参数来使用它们。

这是一个基本用法:

void print() {}

template<class Head, class... Tail>
void print(Head h, Tail... t)
{
    cout << h << endl;
    print(t...);
}

int main()
{
    print(3, "hello", 4.5);
}

在此处查看实际效果:http://ideone.com/VA7YGK

如您所见,它看起来像函数式编程(因为它确实如此!),您在其中匹配将参数列表拆分为头部和尾部的规则,然后用少一个元素调用自身。

另一个例子,来自最近的一个问题,我在其中递归地定义了一个数据结构(简短易读):Multikey map using variadic templates

std::thread 构造函数是另一个例子,一旦它开始在生成的线程中运行,它就需要可变数量的参数将它们提供给函数; C++11 中几乎所有与函数交互的新功能(例如 std::function)都使用可变参数模板,因此它们可以接受任意数量的任意类型的参数。 std::tuplestd::make_tuple()std::tie() 也使用了它。

在网络上搜索您会发现许多更高级的用法。特别注意参数扩展的规则,完美转发。

关于c++ - 我可以区分一个和多个参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19253695/

相关文章:

c - printf 具有固定总长度的双倍

c++ - 如何从 boost::python 返回 numpy.array?

c++ - C++11 : is there a simple way to seed the generator in one place of the code, 中的随机数然后在不同的函数中使用它?

c++ - 校验和和缩短

printing - 如何在 Ocaml 中打印以另一种类型包装的内容的字符串值?

c - 在 char 中传递参数可以使用 printf 正确打印,但不能使用 write

c++ - conio.h getch() 的 Linux 等价物

c++ - 为哈希表获取和设置正确重载 [bracket] 运算符

c++ - 无法在 Visual Studio 2017 中使用 QT

C++ 绑定(bind)非静态成员函数