我尝试将for_each
与boost::trim
一起使用。首先,我使用了错误的代码
std::for_each(v.begin(),v.end(),&boost::trim<std::string>));
// error: too few arguments to function
然后我用这个
修复(在线阅读) std::for_each(v.begin(),v.end()
,boost::bind(&boost::trim<std::string>,_1,std::locale()));
当需要将此函数传递给for_each
时,编译器如何工作。我认为,因为std::locale
是boost::trim
的第二个输入参数的默认参数,我的代码应该有效。
答案 0 :(得分:5)
默认参数在调用函数时应用,但它们不构成函数签名的一部分。特别是,当您通过函数指针调用函数时,通常会丢失默认参数可用的信息:
void (*f)(int, int);
void foo(int a, int b = 20);
void bar(int a = 10, int = -8);
f = rand() % 2 == 0 ? foo : bar;
f(); // ?
结果是,要在bind
上使用f
,您将始终需要填充这两个参数。
答案 1 :(得分:3)
您始终可以使用lambda编写它:
std::for_each(v.begin(), v.end(), [](std::string & s) { boost::trim(s); });
现在编译器将有足够的知识来使用默认参数。