gpt4 book ai didi

c++ - 使用 decltype 选择函数特化

转载 作者:太空狗 更新时间:2023-10-29 21:32:08 24 4
gpt4 key购买 nike

我想知道为什么在我的示例中我不能使用 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 的情况: :字符串。这可以通过 doropping cv 限定符和引用来解决:

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

关于c++ - 使用 decltype 选择函数特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56093245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com