2

由于我无法正确设计我的课程,我达到了需要这样的地步:

struct A
{
   A( function< void(string&) cb > ): callback(cb) {}
   function< void(string&) > callback;

   template <std::size_t T>
   void func( string& str) { ... }
}

int main(){
vector<A> items = {
   A( bind( &A::func<1>, items[0], _1) ),
   A( bind( &A::func<2>, items[1], _1) ),
   ...
}

这可以安全使用吗?如果没有,是否有替代方案?

4

3 回答 3

6

这当然不安全。将在初始化items[0]之前进行评估。items

在这里做的正确的事情可能是只使用一个 lambda,比如

vector<A> items = {
    A( [&items](string& s){ items[0].func(s); } ),
    A( [&items](string& s){ items[1].func(s); } ),
    ...
}

这仅在初始化期间获取对的引用,然后仅在实际调用回调时才items拉出。items[0]

或者,您可以更改回调以A&作为参数吗?如果您的回调类型是,std::function<void(A&, string&)>那么您可以&A::func<1>作为回调传递,它将起作用。

于 2013-01-09T22:06:11.177 回答
5

您正在使用[]运算符在构建之前访问vector它。这不安全。

我认为您将不得不在中创建未完全初始化的项目,vector然后再设置绑定者。

于 2013-01-09T22:05:56.677 回答
0

中的代码main创建一个固定大小的向量。如果这确实是必需的,请使用数组或,并将元素的地址std::array传递给调用:bind

A items[] = {
   A( bind( &A::func<1>, &items[0], _1) ),
   A( bind( &A::func<2>, &items[1], _1) ),
   ...
};

返回的函数对象bind知道如何绑定一个指向对象的指针和一个成员函数。

于 2013-01-09T22:37:23.740 回答