假设我有以下代码:
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类型中提取这些信息吗?
答案 0 :(得分:5)
boost :: bind是一个模板化函数,而不是一个类型。该函数返回的实数类型是某种未指定类型的仿函数。事实上,它可能返回许多不同的未指定的类型,具体取决于boost :: bind函数的参数是什么。
由于类型未指定且库只声明是CopyConstructible,它实现了带有相应数量和类型的参数的operator()(每个占位符一个,从绑定的方法/函数推导出的类型),并且它提供了内部类型 result_type ,与该运算符的返回类型相同()。
那些未指定的类的接口是未指定的。它可能不会提供参数的访问器,即使它确实存在,并且您从研究库的内部获得了内部知识,您可能会因为升级到库而导致代码中断(实现者可以自由更改类型和所有未公开记录的界面。)
整个库是围绕以下事实构建的:您并不真正关心参数是什么,或者即使定义了任何参数或仅使用了占位符,您只关心生成的对象可以使用给定的接口进行调用。
所以不,你不能。
答案 1 :(得分:2)
真正的问题是你为什么要这样做?
我怀疑你不能但是你正在尝试的事实有点令人担忧。
答案 2 :(得分:0)
不,你不能用boost::bind
来做到这一点。
boost::bind
只生成一种functor对象,其中隐藏了所有细节。比你用它构造boost::function
或boost::signal
而你唯一能做的就是:执行。你甚至无法比较boost::function
个对象。
无论如何,目前尚不清楚你正在解决的问题。这种方法对我来说很尴尬。您确定真的需要吗?