【发布时间】:2016-03-14 20:00:51
【问题描述】:
我的意思是为什么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::make_pair。我认为经验法则可能是,如果您可能只想将这些对象构造为另一个表达式的一部分、调用函数等,它们可能存在。 -
您希望
make_*函数用于哪些其他类?我们已经获得了 make_shared、make_unique 等。 -
唯一的区别是类型推导。但是类型推断可能很有用,所以这就是原因。
-
并非所有类型都可以命名。例如。
make_tuple([&](){ f(x); }, std::mem_fn(&X::foo)). -
make_tuple属于make_tuple、tie和forward_as_tuple家族,它们分别为您提供prvalues、lvalues 和forwarded-values。