使用 boost 绑定到仅采用一个参数的方法来提升自定义格式化程序
Posted
技术标签:
【中文标题】使用 boost 绑定到仅采用一个参数的方法来提升自定义格式化程序【英文标题】:boost custom formatter using boost bind to method taking only one paramerter 【发布时间】:2010-11-11 16:19:22 【问题描述】:我正在尝试将 boost::regex_replace 与自定义格式化程序一起使用。我需要从对象传递一个方法,因为替换函数中需要一些成员。
我的替换方法的签名是:
std::string MyObject::ReplaceStr(
boost::match_results<std::string::const_iterator> match) const
当调用regex_replace
时,我传递了这些参数:
std::string replaced = regex_replace(
orig_string, replace_pattern,
boost::bind<std::string>(&MyObject::ReplaceStr, this, _1));
问题是当 regex_replace 在匹配结果上调用 format 方法时,使用的 Functor 是带 3 个参数的 Functor(自定义格式化程序可以是字符串、一元、二元或三元函数)。我认为这是因为 boost::bind 在某种程度上隐藏了函数的数量。
我认为这是由于arity消失的原因是因为与
绑定时std::string replaced = regex_replace(
orig_string, replace_pattern,
std::bind1st(std::mem_fun(&MyObject::ReplaceStr), this));
调用正确的函子(使用一元函数的那个)。
我也可能只是在我的对象中使用三元函数来绑定,然后它可能会起作用,但为了理解和使用 boost::bind 有人可以解释我是否理解正确,如果没有提供正确的解释.
如果我可以使其与 boost 绑定一起使用,则可以加分。
编辑:我忘了告诉它在我使用 boost::bind
时由于选择了错误的方法签名而崩溃。这是一个代码 sn-p 来重现我试图解释的行为:
using namespace std;
using namespace boost;
class MyObject
public:
void ReplacePattern()
const std::string testString = "$value_to_replaceextra_value";
boost::regex replace_pattern("(\\$\\(.*?)\\)");
std::string replaced = regex_replace(testString, replace_pattern, boost::bind(&MyObject::ReplaceStr, this, _1));
cout << "Replaced: " << replaced << endl;
std::string ReplaceStr(
boost::match_results<std::string::const_iterator> match) const
return "replaced_value";
;
int main(int argc, char* argv[])
MyObject obj;
obj.ReplacePattern();
char dummy[1];
cin.getline(dummy, 1);
return 0;
【问题讨论】:
您可以添加示例代码来重现您的问题吗?我试图理解它,但我真的不明白。您的boost::bind
用法对我来说似乎很好,只要只有一个占位符,生成的仿函数就应该是编译器不允许使用 3 个参数调用的一元函数。
【参考方案1】:
您可以使用 boost::function 来避免歧义:
boost::function<std::string (boost::match_results<std::string::const_iterator>)> function =
boost::bind(&MyObject::ReplaceStr, this, _1);
std::string replaced = regex_replace(testString, replace_pattern, function);
【讨论】:
我对这个答案的聪明感到有点羞愧,但它工作得很好。赞一个。以上是关于使用 boost 绑定到仅采用一个参数的方法来提升自定义格式化程序的主要内容,如果未能解决你的问题,请参考以下文章
机器学习集成学习(Boosting)——提升树算法(BDT)(理论+图解+公式推导)
R语言使用caret包构建gbdt模型(随机梯度提升树Stochastic Gradient Boosting )构建回归模型通过method参数指定算法名称