我想知道为什么在我的示例中不能使用decltype说明符来选择特定的模板方法。
只有当我使用声明的模板参数来指向特殊化时,代码才能按预期工作:
template <typename T>
auto sum(const T& value)
{
std::cout << "sum for template" << std::endl;
return sizeof(value);
}
template<>
auto sum(std::string const& value)
{
std::cout << "sum for string" << std::endl;
return value.length();
}
template <typename Last>
auto sumBytes(const Last& last)
{
return sum<Last>(last);
}
template <typename First, typename ...Tail>
auto sumBytes(const First& first, const Tail& ...tail)
{
return sum<First>(first) + sumBytes(tail...);
}
int main()
{
std::string str = "hello";
auto sum = sumBytes(str,2,3,4);
}不出所料,字符串的函数专用化针对字符串参数调用一次。
但是当我使用decltype来确定第一个参数的类型时,没有调用针对字符串的专用函数,而是选择了泛型函数:
template <typename T>
auto sum(const T& value)
{
std::cout << "sum for template" << std::endl;
return sizeof(value);
}
template<>
auto sum(std::string const& value)
{
std::cout << "sum for string" << std::endl;
return value.length();
}
template <typename Last>
auto sumBytes(const Last& last)
{
return sum<decltype(last)>(last);
}
template <typename First, typename ...Tail>
auto sumBytes(const First& first, const Tail& ...tail)
{
return sum<decltype(first)>(first) + sumBytes(tail...);
}
int main()
{
std::string str = "hello";
auto sum = sumBytes(str,2,3,4);
}我想知道为什么在使用decltype说明符时,字符串的特殊化没有被调用?据我所知,decltype应该返回const std::string&类型。
发布于 2019-05-12 02:46:09
decltype(first)将生成std::string const &,而function则专门用于T为std::string的情况。这可以通过doropping cv限定符和reference来修复:
return sum<::std::remove_const_t<::std::remove_reference_t<decltype(first)>>>(first) + sumBytes(tail...);https://stackoverflow.com/questions/56093245
复制相似问题