C++11 可变模板Lambda
面对这个问题,这只能在gcc编译器中听到。我一直在Visual Studio 2013(更新3)中编程 我需要在正确的线程中创建一些对象。 此外,还需要能够传递其创建的函数 此代码C++11 可变模板Lambda,c++11,lambda,variadic-templates,C++11,Lambda,Variadic Templates,面对这个问题,这只能在gcc编译器中听到。我一直在Visual Studio 2013(更新3)中编程 我需要在正确的线程中创建一些对象。 此外,还需要能够传递其创建的函数 此代码 class Object1; class Object2; class MyClass { public: std::function<Object1*( const std::vector<int>& )> creatorForObject1() cons
class Object1;
class Object2;
class MyClass
{
public:
std::function<Object1*( const std::vector<int>& )> creatorForObject1() const;
std::function<Object2*( int, double )> creatorForObject2() const;
private:
// exec 'handler' in other thread when there is a possibility
void execInRightThread( std::function<void()> handler ) const;
// need be called in right thread
Object1& craeteObject1( const std::vector<int>& param );
Object2& craeteObject2( int param1, double param2 );
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> creatorForObject( TObject&( MyClass::*creator )( TParams... ) ) const;
};
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> MyClass::creatorForObject( TObject&( MyClass::*creator )( TParams... ) ) const
{
return [ this, &creator ]( TParams... params )
{
TObject* result = nullptr;
MyClass& me = *const_cast<MyClass*>( this );
me.execInRightThread( [ &me, &result, &creator, ¶ms... ]()
{
result = &( me.*creator )( params... );
} );
while( result == nullptr ); // ugliness
return result;
};
}
std::function<Object1*( const std::vector<int>& )> MyClass::creatorForObject1() const
{
return creatorForObject( &MyClass::craeteObject1 );
}
std::function<Object2*( int, double )> MyClass::creatorForObject2() const
{
return creatorForObject( &MyClass::craeteObject2 );
}
排队
me.execInRightThread( [ &me, &result, &creator, ¶ms... ]()
请帮忙
提前感谢。您可以尝试:
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> MyClass::creatorForObject( TObject&( MyClass::*creator )( TParams... ) ) const
{
return [ this, &creator ]( TParams... params )
{
TObject* result = nullptr;
MyClass& me = *const_cast<MyClass*>( this );
me.execInRightThread( [ & ]()
{
result = &( me.*creator )( params... );
} );
while( result == nullptr ); // ugliness
return result;
};
}
模板
std::function MyClass::creatorForObject(ToObject&(MyClass::*creator)(TParams…)常量
{
返回[此和创建者](TParams…参数)
{
TObject*result=nullptr;
MyClass&me=*常量(此);
me.execInRightThread([&]()
{
结果=&(me.*创建者)(参数…);
} );
while(result==nullptr);//丑陋
返回结果;
};
}
也许您应该通过值来捕获…如果内部lambda生成一个单独的函数,那么这是可行的,但是我不明白上面写的为什么不起作用
class MyClass
{
...
private:
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> creatorForObject( TObject&( MyClass::*creator )( TParams... ) ) const;
template<class TObject, class ...TParams>
TObject* temporaryCreator( TObject&( MyClass::*creator )( TParams... ), TParams... params );
};
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> MyClass::temporaryCreator( TObject&( MyClass::*creator )( TParams... ), TParams... params )
{
TObject* result = nullptr;
execInRightThread( [ this, &result, creator, ¶ms... ]()
{
result = &( me.*creator )( params... );
} );
while( result == nullptr ); // ugliness
return result;
}
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> MyClass::creatorForObject( TObject&( MyClass::*creator )( TParams... ) ) const
{
MyClass& me = *const_cast<MyClass*>( this );
return [ &me, creator ]( TParams... params )
{
return temporaryFunction<TObject, TParams...>( creator, params... );
};
}
class-MyClass
{
...
私人:
模板
std::函数creatorForObject(TObject&(MyClass::*creator)(TParams…)const;
模板
ToObject*临时创建者(ToObject&(MyClass::*创建者)(TParams…,TParams…参数);
};
模板
std::function MyClass::temporaryCreator(TObject&(MyClass::*creator)(TParams…,TParams…params)
{
TObject*result=nullptr;
execInRightThread([this,&result,creator,¶ms…])()
{
结果=&(me.*创建者)(参数…);
} );
while(result==nullptr);//丑陋
返回结果;
}
模板
std::function MyClass::creatorForObject(ToObject&(MyClass::*creator)(TParams…)常量
{
MyClass&me=*常量(此);
return[&me,creator](TParams…params)
{
返回临时函数(创建者、参数…);
};
}
我无法用GCC 4.9.2重现这一点。您使用的编译器版本是什么?也许你应该升级。不能在4.9岁以下复制。我使用微软Visual C++ +2013i意味着我阅读了类似的问题,没有新版本的GCC编译器。不幸的是,它有同样的效果。我也犯了一个错误。而是有me.execInRightThread([&me,&result,&creator,¶ms…])()
needme.execInRightThread([&me,&result,creator,¶ms…])(
class MyClass
{
...
private:
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> creatorForObject( TObject&( MyClass::*creator )( TParams... ) ) const;
template<class TObject, class ...TParams>
TObject* temporaryCreator( TObject&( MyClass::*creator )( TParams... ), TParams... params );
};
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> MyClass::temporaryCreator( TObject&( MyClass::*creator )( TParams... ), TParams... params )
{
TObject* result = nullptr;
execInRightThread( [ this, &result, creator, ¶ms... ]()
{
result = &( me.*creator )( params... );
} );
while( result == nullptr ); // ugliness
return result;
}
template<class TObject, class ...TParams>
std::function<TObject*( TParams... )> MyClass::creatorForObject( TObject&( MyClass::*creator )( TParams... ) ) const
{
MyClass& me = *const_cast<MyClass*>( this );
return [ &me, creator ]( TParams... params )
{
return temporaryFunction<TObject, TParams...>( creator, params... );
};
}