Bir lambda çağıran bir çalışma işlevi şablonum var.Bir lambdada variadic mükemmel iletmeyi nasıl kullanırım?
Variadic argümanları almak ve bunları lambda'ya mükemmel bir şekilde iletmek için bu işlev şablonunu genelleştirmek istiyorum, ancak bu kodu derlemek için sorun yaşıyorum.
gcc 4.7.2 kullanıyorum.
GÜNCELLEME
R. Martinho Fernandes öneri kullanarak
, ben bugzilla'da hatayı baktı - it does look like a bug that's been around for a while. Eğer bir çözümden haberi varsa (şimdi bir tane için kazıyorum), lütfen bir cevap gönderin.HATALAR
junk.cpp: In lambda function:
junk.cpp:32:68: error: parameter packs not expanded with ‘...’:
junk.cpp:32:68: note: ‘args’
junk.cpp: In instantiation of ‘std::pair<std::basic_string<char>, typename T::Lambda> MP(const string&, M, Args&& ...) [with T = Integer; M = int (Integer::*)()const; Args = {}; typename T::Lambda = std::function<std::function<int()>(const Integer&)>; std::string = std::basic_string<char>]’:
junk.cpp:47:42: required from here
junk.cpp:34:2: error: using invalid field ‘MP(const string&, M, Args&& ...)::<lambda(const T&)>::__args’
make: *** [junk] Error 1
KOD Bu (zaten değilse lütfen bildirin) derleyici bir hata gibi görünen
#include <functional>
#include <iostream>
#include <map>
struct Integer
{
typedef std::function<int()> Function;
typedef std::function<Function(Integer const& inst)> Lambda;
virtual int getInt() const = 0;
};
struct IntImpl : public Integer
{
virtual int getInt() const { return 42; }
};
typedef std::function<int()> IntFunction;
typedef std::function<IntFunction(Integer const& inst)> IntLambda;
#define WONT_COMPILE
template<typename T,typename M,typename... Args>
std::pair<std::string,typename T::Lambda>
MP(std::string const& str, M method, Args&&... args)
{
#ifdef WONT_COMPILE
return std::make_pair(str,
[=](T const& inst)
{
// COMPILE ERROR (Line 32) on next line
return std::bind(method, std::cref(inst), std::forward<Args>(args)...);
}
);
#else
return std::make_pair(str,
[method](T const& inst)
{
return std::bind(method, std::cref(inst));
}
);
#endif
}
std::map<std::string,IntLambda> const g_intTbl =
{
MP<Integer>("getInt", &Integer::getInt)
};
int
main(int argv, char* argc[])
{
IntImpl x;
std::cerr << g_intTbl.find("getInt")->second(x)() << std::endl;
}
bu hataların bazıları (... args) '' std ileri :: (args) olmalıdır std ileri :: 'Çünkü ortaya görünmektedir ...' –
@AndreiTita 1 ty - yardımcı olur - Ben Yine de hatalar alıyorum - OP güncellendi – kfmfe04
Peki, lambda yakalamalarda varadik paketleri genişletmek için izinli olup olmadığını bilmiyorum (bir anda bunu kontrol edecek), ama bir geçici çözüm gibi tam bir yakalama kullanmak olacaktır '[=]'. –