Mój szablon-fu jest raczej słaby. Mam ten kod:W jaki sposób można uzyskać kompilator C++ do pośredniego wydedukowania T?
template<typename T>
void Foo(void(*func)(T*)) { }
void Callback(int* data) { }
int Test()
{
Foo(Callback);
}
... ale chciałbym coś bardziej czytelny niż bolesnego wskaźnik funkcji składni C jest z void(*func)(T*)
.
Ktoś w moim zespole zaproponował to:
template<typename T>
struct Types
{
typedef void Func(T*);
};
template<typename T>
void Foo2(typename Types<T>::Func* func) {}
void Test2()
{
Foo2(Callback); // could not deduce template argument for 'T'
Foo2<int>(Callback); // ok
}
(ja wciąż zastanawiając się, czy to jest rzeczywiście bardziej czytelny, ale to osobna kwestia).
Jak mogę pomóc postać kompilatora się co to jest T bez konieczności wyraźnego określania go w dzwoniącym?
Nie sądzę, że sugerowane rozwiązanie jest bardziej czytelne. Nawet odwrotnie. Ale tylko moja opinia. –
Wszystko po lewej stronie '::' jest kontekstem niewydechem. W C++ 11 użyj szablonów aliasów: 'template using Func = void (A *); template void Foo (Func * func) {} ' –
W twoim kodzie wywołanie zwrotne ma parametr" T * ". W jaki sposób 'Foo' wie, co przekazać do wywołania zwrotnego? To nie wygląda na prawdziwy kod –