使用 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)(理论+图解+公式推导)

提升几何:从多个点组成多边形

Elasticsearch:Index boost

Elasticsearch:Index boost

R语言使用caret包构建gbdt模型(随机梯度提升树Stochastic Gradient Boosting )构建回归模型通过method参数指定算法名称

如何将具有参数的类成员函数作为右值绑定到 boost::function? [关闭]