c++ - `std::make_tuple` 的原因是什么?

标签 c++ c++11 stdtuple

我的意思是为什么 std::make_tuple 存在?我知道在某些情况下,该函数会减少您必须输入的字符数量,因为您可以避免使用模板参数。但这是唯一的原因吗?是什么让 std::tuple 函数存在而其他类模板没有这样的函数?仅仅是因为在这种情况下您可能会更频繁地使用 std::tuple 吗?


以下是 std::make_tuple 减少字符数量的两个示例:

// Avoiding template parameters in definition of variable.
// Consider that template parameters can be very long sometimes.
std::tuple<int, double> t(0, 0.0); // without std::make_tuple
auto t = std::make_tuple(0, 0.0);  // with std::make_tuple

// Avoiding template parameters at construction.
f(std::tuple<int, double>(0, 0.0)); // without std::make_tuple
f(std::make_tuple(0, 0.0));         // with std::make_tuple

但就像上面写的那样,对于许多其他类模板,您没有这样的功能。

最佳答案

因为你不能对构造函数使用参数推导。你需要明确写std::tuple<int, double>(i,d); .

它可以更方便地创建一个元组并将其一次性传递给另一个函数。

takes_tuple(make_tuple(i,d))takes_tuple(tuple<int,double>(i,d)) .

i 的类型时少了一个地方要改变或 d变化,尤其是在新旧类型之间可能存在转换的情况下。

如果可以写std::tuple(i,d); , make_*会(可能)是多余的。

(不要在这里问为什么。也许出于类似的原因,语法 A a(); 不调用默认构造函数。有一些令人痛苦的 c++ 语法特性。)

更新说明:Daniel正确地注意到,c++17 将得到增强,因此模板参数推导将适用于构造函数,并且这种委托(delegate)将变得过时。

关于c++ - `std::make_tuple` 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34180636/

相关文章:

c++ - 如何通过类型推导过滤可变参数模板包?

c++ - 如何扩展元组以匹配提供的参数?

c++ - 虚拟表指针和虚拟表模拟

c++ - Qthread信号发出未连接

c++11 - ' &' or ' =' 在 lambda 捕获表达式中?

c++ - 在递归函数中打印 C++ 中的累计和

C++ 将同类包装类型的元组转换为原始类型的元组

c++ - 通过模板参数给定其长度,在编译时生成相同类型的 std::tuple

c++ - std::list 是否指向同一内存?

c++ - 如何分配当前在分配期间引发 std::bad_alloc 错误的大型 bool 数组?