próbowałem skompilować następujący przykład używając VC11 i g ++ 4.7.2:Jak mogę powiązać szablon funkcji członek przechodzącego nieokreślone połączenia opakowanie
#include <functional>
class X {
public:
template <typename T>
explicit X(T t)
{
std::bind(&X::invoke<T>, this, t)();
}
private:
template <typename T>
void invoke(T t)
{
t();
}
};
class Y {
public:
void foo() {
//...
}
};
int main() {
Y y;
X x(std::bind(&Y::foo, &y));
return 0;
}
ale skończył z błędami. Nie jestem pewien, czy to jest rozsądne, aby wkleić cały wyjście kompilatorów ale generalnie
vc11 mówi:
error C2664: 'void std::_Pmf_wrap::operator()(_Farg0 &,_V0_t) const' : cannot convert parameter 3 from 'void' to 'std::_Bind,Y *,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152 1 ConsoleApplication1 (Microsoft Visual C++ Compiler Nov 2012 CTP)
i g ++:
Compilation finished with errors:
source.cpp: In instantiation of 'X::X(T) [with T = std::_Bind(Y*)>]':
source.cpp:28:33: required from here
source.cpp:8:9: error: no match for call to '(std::_Bind_helper(Y*)>), X* const, std::_Bind(Y*)>&>::type {aka std::_Bind(Y*)>)>(X*, std::_Bind(Y*)>)>})()'
Czy istnieje sposób, aby rozwiązać ten problem. Bardzo ważne jest dla mnie, aby zapisać główną ideę - klasę, która może być utworzona z dowolnym obiektem wywoływanym (obiekt funkcji, wskaźnik funkcji lub opakowanie zawijania zwrócone przez funkcję std::bind()
).
Byłbym wdzięczny, gdyby ktoś pomógł.
P.S. Kompiluje się, jeśli utworzę instancję X
, przekazując obiekt funkcji lub wskaźnik funkcji.
Rozwiązuje to nieco inny problem, według mnie. Oryginalne wyrażenie wiążące jest samoistne w tym sensie, że przechowuje kopie wszystkich argumentów, tak że argumenty mogą zostać zniszczone. Twoje rozwiązania pomijają kopiowanie funktora i polegają na tym, że wciąż jest on w zasięgu i żyje w momencie połączenia. Realistycznie nie ma sensu tworzenie wyrażenia powiązania, a następnie natychmiastowe wywoływanie go. Zamiast tego chcesz przekazać funktorowi utworzony przez bindowanie gdzie indziej i często opóźniając wywoływanie do później. –
@MaximYegorushkin: Rzeczywiście. Jest to jednak skuteczne obejście problemu użycia OP. –
Nie jestem pewien, czy to jest jego prawdziwy przypadek użycia. Zobacz mój zaktualizowany poprzedni komentarz. –