2012-10-01 29 views
5

Powiel możliwe:
using declaration in variadic templateo zmiennej liczbie argumentów ekspansja używając-deklaracji

Niedawno natknąłem a generic mechanism do łączenia dwóch obiektów funkcyjnych w celu utworzenia nowego obiektu funkcji, która zachowuje się jak gdyby dwa pierwsze zostały przeciążone:

template <typename F1, typename F2> 
struct overload : public F1, public F2 
{ 
    overload(F1 f1, F2 f2) : F1(f1), F2(f2) {} 

    using F1::operator(); 
    using F2::operator(); 
}; 

Próbuję rozszerzyć ten pomysł t O pracy dla obiektów funkcji n, używając zmiennej liczbie argumentów szablony:

template <typename... Fs> 
struct overload : public Fs... 
{ 
    overload(Fs... fs) : Fs(fs)... {} 

    using Fs::operator();... 
}; 

Jednak GCC narzeka mojej próbie zrobienia zmiennej liczbie argumentów ekspansję na używając-deklaracji:

test.cpp:6:24: error: parameter packs not expanded with '...': 
    using Fs::operator();... 
         ^
test.cpp:6:24: note:   'Fs' 
test.cpp:6:26: error: expected unqualified-id before '...' token 
    using Fs::operator();... 
         ^

próbowałem kilka odmian, takich jako:

using Fs::operator()...; 

i

using Fs...::operator(); 

ale też nie działa.

Czy można to zrobić?

+1

Należy zauważyć, że typ klasy z operatorem konwersji na przykład: typ wskaźnika funkcji (tzw. funkcja wywołania zastępczego) jest typem funktora, ale nie jest kompatybilny z takim mechanizmem. Nie ma to większego znaczenia, ponieważ są to egzotyki, ale trochę frustrujące jest to, że nie są całkowicie ogólne (TTBOMK). –

+1

[This] (http://stackoverflow.com/questions/7870498/using-declaration-in-variadic-template) może być pomocne (jeśli nie w celu uzyskania odpowiedzi, przynajmniej w odniesieniu do podjętej próby). –

+0

@ Luc: Czy to nie jest bezpośredni duplikat? Zagłosowano, aby zamknąć jako jeden. – Xeo

Odpowiedz

0

Zamiast “ Niedawno natknąłem ogólny mechanizm ” prosimy dostarczyć referencje takich jak “ Niedawno natknąłem się na blog posting by Dave Abrahams opisujący ogólny mechanizm ” & hellip ;.

wątpię, że ekspansja parametr paczka jest obsługiwany przez using oświadczenia, a ja ’ Przepraszam, że don ’ t mieć czas, aby sprawdzić standardowe – że ’ s ponownie swoją pracę, przeczytać dokumentację przed pytaniem pytanie.

Jednak jako praktyczną kwestię rozwiązania problemu (a nie pytania językowego), zawsze można zakodować to rekurencyjnie, zamiast korzystać z bezpośredniej ekspansji. Po prostu dziedzicz z klasy, która sprowadza resztę funktorów, a następnie przynieś pierwszą. Gdzie “ reszta ” jest etapem rekursywnym, kończącym się na pustej liście funktorów jako przypadkiem podstawowym.

+0

Zamierzałem dodać link do miejsca, w którym zobaczyłem dany mechanizm, ale nie mogłem znaleźć tego artykułu ani przypomnieć jego nazwy w chwili pisania tego pytania. Dzięki za przekopanie! – HighCommander4

+0

Rozwiązanie rekurencyjne to niezły pomysł. W rzeczywistości artykuł, z którym się łączysz, zawiera link w przypisie (https://gist.github.com/3779345) do takiego rozwiązania. – HighCommander4

+0

@ HighCommander4: heh, nie wiedziałem. –

Powiązane problemy