我的意思是为什么 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/