gpt4 book ai didi

c++ - 为 tolower 禁用不需要的过载

转载 作者:太空狗 更新时间:2023-10-29 20:39:38 28 4
gpt4 key购买 nike

在研究过程中,我发现了 Why “transform(s.begin(),s.end(),s.begin(),tolower)” can't be complied successfully? ,解决方案是使用::tolower。作为练习,我想看看我是否可以禁用该(在 locale 头文件中)重载并使用 std::tolower。首先,我们从简单开始:

template <typename charT> charT tolower(charT c, std::locale const& loc) = delete;

int main()
{
std::vector<char> chars = { 'a', 'D', 'c', 'b' };
std::transform(chars.begin(), chars.end(), chars.begin(), std::tolower);
}

编译器无法推断正确的重载。所以我们提供了char模板:

std::transform(chars.begin(), chars.end(), chars.begin(), std::tolower<char>);

所以我们回到原点。我知道这是未定义的行为,但我认为我可以将它放入命名空间 std:

namespace std {
template <typename charT> charT tolower(charT c, std::locale const& loc) = delete;
}

现在编译器说我正在重新定义函数。

using std::tolower;
template <typename charT> charT tolower(charT c, std::locale const& loc) = delete;

也不行。

现在这是毫无意义的练习,但这可能吗?

最佳答案

您无法禁用其他重载,但有很多方法可以确保选择正确的重载:

int (*lower)(int) = std::tolower;
std::transform(chars.begin(), chars.end(), chars.begin(), lower);

std::transform(chars.begin(), chars.end(), chars.begin(), static_cast<int(*)(int)>(std::tolower));

std::transform(chars.begin(), chars.end(), chars.begin(), [](int c) { return std::tolower(c); });

struct ToLower {
int operator()(int c) const { return std::tolower(c); }
};
std::transform(chars.begin(), chars.end(), chars.begin(), ToLower{});

前两种形式告诉编译器如何从重载集中选择正确的重载,因为只有一个重载可以转换为该类型的函数指针。

后两种形式创建了一个调用tolower 的包装器,以便正常的重载解析找到正确的,并且您不需要获取tolower 的地址。

关于c++ - 为 tolower 禁用不需要的过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27273278/

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