我知道经常被问到的 How do I specify a pointer to an overloaded function? 的答案:使用赋值或使用强制转换,并且每个其他C ++教程都会对这样的字符串进行大写(给予或取{{1} }}):
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);
的{{1}}重载。
但是这引出了一个问题:如何以类似的方式选择<cctype>
重载?
std::toupper
或者,更实际地,考虑有人试图在算法中使用C ++ 11 <locale>
将字符串向量转换为整数向量:char (*fp2)(char, const std::locale&) = std::toupper;
transform(in.begin(), in.end(), back_inserter(out), fp2);
// error: too few arguments to function
有两个重载({{1 } / std::stoi
),每个都有两个额外的默认参数。
假设我不想explicitly bind所有这些默认值,我相信如果不将此类调用包含在辅助函数或lambda中,则无法执行此操作。是否有一个提升包装或TMP魔术以完全通用的方式为我做这件事?是否可以写出stoi
或者更可能string
这样的包装器?
答案 0 :(得分: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);
});
我使用静态来节省每次重新分配的工作量。
或者您可以获得typedef并执行:
std::bind((LocaleCompare)std::toupper, std::placeholders::_1, loc); // UGLY!
答案 1 :(得分:0)
您可以创建该functon指针类型的typedef,然后转换该函数。
typedef char (*LocaleToUpper)(char, const std::locale&) ;
char (*fp2)(char, const std::locale&) = (LocaleToUpper)toupper;