0

假设我有以下代码:

int f(int, int);

int main()
{
    SomeFunc(boost::bind(f, 1, 2));
}

从 SomeFunc() 函数中,是否可以访问绑定类型所持有的参数?像这样的东西(伪代码):

// Obvious syntax issues...
void SomeFunc(boost::bind& functor)
{
    if(functor.function == &f)
    {
        if(functor.argument1 == 1)
            DoSomething();
    }
}

我可以从 boost::bind 类型中提取这些信息吗?

4

3 回答 3

5

boost::bind 是一个模板函数,而不是一个类型。该函数返回的真实类型是某种未指定类型的函子。事实上,它可能返回许多不同的未指定类型,具体取决于 boost::bind 函数的参数。

由于类型未指定,并且库仅声明是 CopyConstructible,它使用适当数量和类型的参数(每个占位符一个,从绑定方法/函数推导出的类型)实现 operator(),并且它提供内部类型result_type这与该 operator() 的返回类型相同。

那些未指定的类的接口是未指定的。它可能不会提供对参数的访问器,即使它提供了,并且您通过研究库的内部结构获得内部知识,您可能会因升级库而导致代码中断(实现者可以自由更改类型和所有未公开记录的接口)。

整个库是围绕这样一个事实构建的,即您并不真正关心参数是什么,或者即使定义了任何参数或仅使用了占位符,您只关心生成的对象是否可以使用给定的接口调用。

所以不,你不能。

于 2009-09-08T20:08:23.327 回答
2

真正的问题是你为什么要这样做?
我怀疑你不能,但你正在尝试的事实有点令人担忧。

于 2009-09-08T19:49:42.523 回答
0

不,你不能用boost::bind.

boost::bind只是生成一种函子对象,其中隐藏了所有细节。比您构建boost::functionboost::signal使用它,您唯一可以做的事情是:执行。你甚至无法比较boost::function对象。

无论如何,尚不清楚您正在解决的问题。这种方法在我看来很尴尬。你确定你真的需要那个吗?

于 2009-09-08T19:50:46.577 回答