Załóżmy, że mam klasę, która zawiera obiekt funkcjonalny, aw wywołaniu konstruktora przekazuję argumenty, które mają zostać przekazane do obiektu funkcjonalnego w pewnym momencie później. Coś jak:Szablony varariadyczne - jak utworzyć typ, który przechowuje przekazane argumenty?
class Binder{
public:
Binder(functional_object, listOfParameters);
callFunctionalObject(); // calls functional object with given list of parameters
};
Przed C++ 11 nie mogłem korzystać z szablonów o zmiennej liczbie argumentów, więc należałoby zrobić:
struct none{};
template <typename T1, typename T2=none, typename T3=none>
class Binder{
public:
Binder(T1 functionalObject, T2 arg1=none(), T3arg3=none());
void callFunctionalObject();
private:
T1 m_functionalObject;
T2 m_arg1;
T3 m_arg2;
};
Gdzie callFunctionalobject
mogą być realizowane w następujący sposób:
template<typename T1, typename T2, typename T3>
void Binder<T1,T2,T3>::callFunctionalObject(){
callImpl(m_functionalObject, m_arg1, m_arg2);
}
i callImpl
byłby przeciążony, aby rozpoznać obiekty typu none
, aby przekazać odpowiednią liczbę argumentów do obiektu funkcjonalnego.
Przejście na C++ 11 Nie wiem, jak zrealizować fakt, że w sekcji prywatnej mam członków, do których mam bezpośredni dostęp.
Czy ktoś może mi wyjaśnić, w jaki sposób mogę zrobić to samo, używając C++ 11 lub C++ 14?
myślałem o czymś takim, ale nie functionalObject następnie dostać jeden touple w parametrach zamiast normalnego listy parametrów? – DawidPi
Rozpakowywanie parametrów krotki wymaga trochę pracy, próbując uzyskać rozwiązanie kodu na żywo dla ciebie :) – coincoin
@DawidPi Zaktualizowano rozwiązanie C++ 14 za pomocą 'std :: index_sequence' – coincoin