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

Cub*_*bbi 10 c++ overloading default-arguments c++11

我知道常见问题的答案如何指定指向重载函数的指针?:使用赋值或使用强制转换,并且每个其他C++教程都会使用这样的字符串(赋予或接受static_cast):

transform(in.begin(), in.end(), back_inserter(out), (int(*)(int)) std::toupper);
Run Code Online (Sandbox Code Playgroud)

或者像这样:

int (*fp)(int) = std::toupper;
transform(in.begin(), in.end(), back_inserter(out), fp);
Run Code Online (Sandbox Code Playgroud)

它整齐地选择了<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
Run Code Online (Sandbox Code Playgroud)

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

假设我不想显式绑定所有这些默认值,我相信如果不在辅助函数或lambda中包含这样的调用就不可能这样做.是否有一个提升包装或TMP魔术以完全通用的方式为我做这件事?一个包装器可以call_as<char(char)>(fp2),call_as<int(const std::string&)>(std::stoi)甚至更可能,甚至可以写?

nor*_*lli 5

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

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

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

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

 std::bind((LocaleCompare)std::toupper, std::placeholders::_1, loc); // UGLY!
Run Code Online (Sandbox Code Playgroud)