c – std :: for_each忽略默认函数参数

c – std :: for_each忽略默认函数参数,第1张

概述我偶然发现了一个奇怪的编译问题.我想使用std :: for_each处理字符串列表.以下简化代码说明了问题: # include <list># include <string># include <algorithm>using namespace std ;void f(wstring & str){ // process str here}void g(wstr 我偶然发现了一个奇怪的编译问题.我想使用std :: for_each处理字符串列表.以下简化代码说明了问题:
# include <List># include <string># include <algorithm>using namespace std ;voID f(wstring & str){    // process str here}voID g(wstring & str,int dummy = 0){    // process str here,same as f,just added a second default dummy argument}int main(int,char*[]){    List<wstring> text ;    text.push_back(L"foo") ;    text.push_back(L"bar") ;    for_each(text.begin(),text.end(),f) ;  // OK,fine :)    for_each(text.begin(),g) ;  // Compilation error,complains about                      // g taking 2 arguments,but called within std::for_each                     // with only one argument.     // ...    return 0 ;}

我使用MinGW 4.5.2和MSVC10进行了测试,两者都报告了相同的错误消息.最初,我想使用boost :: algorithm :: trim作为传递给std :: for_each的处理函数,但我发现它需要两个参数,第一个是必需的(要处理的字符串),第二个是可选的(提供空间字符定义的语言环境.

当使用带有默认参数的函数或方法时,有没有办法在使用std :: for_each(和其他标准算法)时保持清洁?我找到了一种让它工作的方法,但它不再清晰易懂,因此for循环看起来更容易……

# include <List>    # include <string># include <algorithm># include <boost/bind.hpp># include <boost/algorithm/string.hpp>using namespace std ;using namespace boost ;// ... somewhere insIDe mainList<wstring> text ;for_each(text.begin(),bind(algorithm::trim<wstring>,_1,locale()) ;// One must deal with default arguments ...// for_each(text.begin(),algorithm::trim<wstring>) would be a real pleasure

谢谢你的帮助 !

注意:我刚开始学习英语,对不起错误:)

解决方法 默认参数只是一个代码生成工具,而不是函数签名的一部分,因此您无法真正解决这个问题.你可以将你的函数包装在一个函数对象中,但这正是bind已经为你做的.

但是,在C 0x中,您可以方便地存储结果(并使用std :: bind),以使代码更具可读性:

auto trimmer = std::bind(boost::algorithm::trim<std::wstring>,std::placeholders::_1,std::locale());std::for_each(text.begin(),trimmer);

(你不想在C 98/03中这样做的原因是绑定的返回类型是相当难看的,你不会通过拼写它来帮助任何人.)

或者,再次在C 0x中,您可以使用lambda:

std::for_each(text.begin(),[](std::wstring & s){ boost::algorithm::trim<std::wstring>(s); });
总结

以上是内存溢出为你收集整理的c – std :: for_each忽略默认函数参数全部内容,希望文章能够帮你解决c – std :: for_each忽略默认函数参数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存