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)甚至更可能,甚至可以写?
这很有趣,我做了类似的事情.我发现这样做的最好方法是使用如下的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)