在使用可变参数模板时,我发现:
template <class... Ts> struct tuple {};
template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...>
{
tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {}
T tail;
};
我只想学会理解这里发生的事情:我们可以通过以下方式实例化这样的元组
tuple<int, double, const char*, const char*, const char*> myTuple(1234, 33.444, "I", "like", "C++");
但不包括:
tuple myTuple2(1234, 33.444, "I", "like", "C++");
为什么编译器无法从给定类型列表中自动推断类型?
如果我这样做
template <class T>
void swap(T& first, T& second) {
T aux = first;
first = second;
second = aux;
}
...
...
swap<int>(a, b);
swap(a, b);
两种变体都是可能的。对于可变参数模板参数来说这是不可能的吗? C++ 使用哪些规则来推断类型?
最佳答案
tuple myTuple2(1234, 33.444, "I", "like", "C++");
是通过调用构造函数来声明变量并初始化,而
swap(a, b);
是一个函数调用。
虽然 C++ 总是有 function template argument deduction ,它不支持class template argument deduction直到 C++17。这就是std::make_tuple
的原因存在。因为您无法执行 std::tuple t(1, 2.4)
,所以您有一个函数并且可以编写 auto t = std::make_tuple(1, 2.4)
>.
因此您需要 C++17,并且对于您的示例,您还需要推导指南:
template <class... Ts>
tuple(Ts...) -> tuple<Ts...>;
和it works .
关于c++ - 为什么在该示例中模板参数没有自动推导?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59213728/