C++11 可变模板Lambda

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

面对这个问题,这只能在gcc编译器中听到。我一直在Visual Studio 2013(更新3)中编程

我需要在正确的线程中创建一些对象。 此外,还需要能够传递其创建的函数

此代码

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, &params... ]()
        {
            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, &params... ]()
请帮忙

提前感谢。

您可以尝试:

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, &params... ]()
    {
        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…])()
need
me.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, &params... ]()
    {
        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... );
    };
}