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

时间:2011-07-06 22:13:35

标签: c++ c++11 overloading default-arguments

我知道经常被问到的 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这样的包装器?

2 个答案:

答案 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;