首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用decltype选择函数专门化

使用decltype选择函数专门化
EN

Stack Overflow用户
提问于 2019-05-12 02:38:47
回答 1查看 54关注 0票数 3

我想知道为什么在我的示例中不能使用decltype说明符来选择特定的模板方法。

只有当我使用声明的模板参数来指向特殊化时,代码才能按预期工作:

代码语言:javascript
复制
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来确定第一个参数的类型时,没有调用针对字符串的专用函数,而是选择了泛型函数:

代码语言:javascript
复制
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&类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-12 02:46:09

decltype(first)将生成std::string const &,而function则专门用于Tstd::string的情况。这可以通过doropping cv限定符和reference来修复:

代码语言:javascript
复制
return sum<::std::remove_const_t<::std::remove_reference_t<decltype(first)>>>(first) + sumBytes(tail...);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56093245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档