使用声明类型选择函数专业化

Using decltype to choose function specialization

本文关键字:函数 专业化 选择 类型 声明      更新时间:2023-10-16

我想知道为什么在我的示例中我不能使用 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&类型。

decltype(first)将产生 std::string const &,而当Tstd::string时,功能专门为情况。这可以通过Doropping CV预选赛和参考来解决:

return sum<::std::remove_const_t<::std::remove_reference_t<decltype(first)>>>(first) + sumBytes(tail...);