模板化成员函数中的模板类型推导 class
template type deduction in a member function of a templated class
main函数第一行推导失败,不加模板参数如何解决
#include <iostream>
template <typename T>
class myVec{
size_t _size{};
size_t capacity{};
T* data{};
public:
myVec(size_t size = 0, T value = T{}):_size{size}, capacity{2 * _size}{
data = new T[capacity];
for(size_t index{}; index < _size; index++)
data[ index ] = T{};
}
template <typename ... Ts>
myVec( Ts&& ... vals):myVec{ sizeof...(vals)}{
size_t index{};
((data [ ++index ] = vals),...);
}
~myVec(){
delete[] data;
}
size_t size( ){
return _size;
}
/*the rest */
};
int main(){
myVec vec {1, 32, 5, 6};
for(size_t index{}; index < vec.size(); ++index )
std::cout << vec[ index ] << " ";
}
Class 模板只能隐式推导出 class 模板参数,前提是它与构造函数完全匹配,例如:
template <typename T>
class myVec
{
...
myVec(int, T); // T can be deduced since it's from the class template
...
};
...
myVec(5,5); // deduces myVec<int>
另一方面,构造函数模板中的类型不直接参与推导——因为推导的类型不一定与 class 模板的类型相同:
template <typename T>
class myVec
{
...
template <typename U>
myVec(int, U); // U may not be the same as T!
...
template <typename...Ts>
myVec(Ts&&...); // All 'Ts' types may not be the same as 'T'
...
};
解决这个问题的方法是 user-defined deduction guides。这些允许您定义在面对其他不明确的构造函数表达式时推导的类型。在你的情况下,你可能正在寻找类似的东西:
template <typename...Ts>
myVec(Ts...) -> myVec<std::common_type_t<Ts...>>;
注意: std::common_type_t
用于获取所有可变类型的公共类型。它在 <type_traits>
header.
中定义
main函数第一行推导失败,不加模板参数如何解决
#include <iostream>
template <typename T>
class myVec{
size_t _size{};
size_t capacity{};
T* data{};
public:
myVec(size_t size = 0, T value = T{}):_size{size}, capacity{2 * _size}{
data = new T[capacity];
for(size_t index{}; index < _size; index++)
data[ index ] = T{};
}
template <typename ... Ts>
myVec( Ts&& ... vals):myVec{ sizeof...(vals)}{
size_t index{};
((data [ ++index ] = vals),...);
}
~myVec(){
delete[] data;
}
size_t size( ){
return _size;
}
/*the rest */
};
int main(){
myVec vec {1, 32, 5, 6};
for(size_t index{}; index < vec.size(); ++index )
std::cout << vec[ index ] << " ";
}
Class 模板只能隐式推导出 class 模板参数,前提是它与构造函数完全匹配,例如:
template <typename T>
class myVec
{
...
myVec(int, T); // T can be deduced since it's from the class template
...
};
...
myVec(5,5); // deduces myVec<int>
另一方面,构造函数模板中的类型不直接参与推导——因为推导的类型不一定与 class 模板的类型相同:
template <typename T>
class myVec
{
...
template <typename U>
myVec(int, U); // U may not be the same as T!
...
template <typename...Ts>
myVec(Ts&&...); // All 'Ts' types may not be the same as 'T'
...
};
解决这个问题的方法是 user-defined deduction guides。这些允许您定义在面对其他不明确的构造函数表达式时推导的类型。在你的情况下,你可能正在寻找类似的东西:
template <typename...Ts>
myVec(Ts...) -> myVec<std::common_type_t<Ts...>>;
注意: std::common_type_t
用于获取所有可变类型的公共类型。它在 <type_traits>
header.