为什么不能在函数中使用模板别名作为参数并自动推导?
Why is it not possible to use a template alias in function as parameter and to be automatically deduced?
我试图通过使用模板别名而不是基础类型来简化模板函数:
template<typename T,
typename Traits = std::char_traits<T>,
typename Allocator = std::allocator<T>,
typename String = std::basic_string<T, Traits, Allocator>,
typename Vector = std::vector<String>>
Vector make_vector_from_string(const String & str)
{
//do something with str parameter
return Vector{
{str}
};
}
但调用者需要指定模板类型,因为编译器无法为参数推导出T:
std::string bar{"bar"};
auto strings{make_vector_from_string<char>(bar)};
如果函数参数类型更改为 std::basic_string<T, Traits, Allocator>
而不是 String
,调用者可以简单地调用 make_vector_from_string(bar);
而无需指定模板参数。这是为什么?
T
是不可推导的,只有 String
是。
如果您想为 T
、Traits
、Allocator
自动提供类型。你必须用另一种方式来做:
template <
typename String,
typename T = typename String::value_type,
typename Traits = typename String::traits_type,
typename Allocator = typename String::allocator_type,
typename Vector = std::vector<String>>
Vector make_vector_from_string(const String& str)
{
//do something with str parameter
return {str};
}
但是
template <typename String>
std::vector<String> make_vector_from_string(const String& str)
{
//do something with str parameter
return {str};
}
好像够了。
甚至
std::vector<std::string> make_vector_from_string(const std::string& str)
{
return { str};
}
我试图通过使用模板别名而不是基础类型来简化模板函数:
template<typename T,
typename Traits = std::char_traits<T>,
typename Allocator = std::allocator<T>,
typename String = std::basic_string<T, Traits, Allocator>,
typename Vector = std::vector<String>>
Vector make_vector_from_string(const String & str)
{
//do something with str parameter
return Vector{
{str}
};
}
但调用者需要指定模板类型,因为编译器无法为参数推导出T:
std::string bar{"bar"};
auto strings{make_vector_from_string<char>(bar)};
如果函数参数类型更改为 std::basic_string<T, Traits, Allocator>
而不是 String
,调用者可以简单地调用 make_vector_from_string(bar);
而无需指定模板参数。这是为什么?
T
是不可推导的,只有 String
是。
如果您想为 T
、Traits
、Allocator
自动提供类型。你必须用另一种方式来做:
template <
typename String,
typename T = typename String::value_type,
typename Traits = typename String::traits_type,
typename Allocator = typename String::allocator_type,
typename Vector = std::vector<String>>
Vector make_vector_from_string(const String& str)
{
//do something with str parameter
return {str};
}
但是
template <typename String>
std::vector<String> make_vector_from_string(const String& str)
{
//do something with str parameter
return {str};
}
好像够了。
甚至
std::vector<std::string> make_vector_from_string(const std::string& str)
{
return { str};
}