gpt4 book ai didi

c++ - 如何在算法中使用带默认参数的重载函数?

转载 作者:可可西里 更新时间:2023-11-01 16:16:32 25 4
gpt4 key购买 nike

我知道常见问题的答案 How do I specify a pointer to an overloaded function? :无论是赋值还是强制转换,所有其他 C++ 教程都会像这样大写一个字符串(给或取 static_cast ):

transform(in.begin(), in.end(), back_inserter(out), (int(*)(int)) std::toupper);

或者像这样:

int (*fp)(int) = std::toupper;
transform(in.begin(), in.end(), back_inserter(out), fp);

它巧妙地选择了 <cctype>过载 std::toupper .

但这引出了一个问题:我怎样才能选择 <locale>以类似的方式重载?

char (*fp2)(char, const std::locale&) = std::toupper;
transform(in.begin(), in.end(), back_inserter(out), fp2);
// error: too few arguments to function

或者,更实际地,考虑有人试图使用 C++11 std::stoi在将字符串 vector 转换为整数 vector 的算法中:stoi有两个重载 ( string/wstring ),每个都有两个额外的默认参数。

假设我不想 explicitly bind所有这些默认值,我相信如果不将此类调用包装在辅助函数或 lambda 中,就不可能做到这一点。是否有提升包装器或 TMP 魔法以完全通用的方式为我做这件事?可以像call_as<char(char)>(fp2)这样的包装器吗?或者,更有可能的是 call_as<int(const std::string&)>(std::stoi)甚至被写入?

最佳答案

很有趣,我也在做类似的事情。我发现最好的方法是按如下方式使用 lambda,因为否则,您必须使用 typedef 来获得正确的重载,并使用 std::bind 来摆脱语言环境,或者不使用语言环境。但是,这更干净:

static const std::locale loc;
transform(in.begin(), in.end(), back_inserter(out), [&loc](char c) {
return std::toupper(c, loc);
});

我使用静态来节省每次重新分配的工作量。

或者你可以得到一个 typedef 并做:

 std::bind((LocaleCompare)std::toupper, std::placeholders::_1, loc); // UGLY!

关于c++ - 如何在算法中使用带默认参数的重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6603696/

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