Abstrakcyjna metoda z niezdefiniowaną liczbą argumentów

0

Hej, czy istnieje jakiś sposób na przedstawienie metody asbrakcyjnej z niezdefiniowaną liczbą argumentów? Klasa dziedzicząca mogłaby mieć taką metodę z różnymi parametrami ale już określonymi,

Przykład:

class Interface
{
public:
    virtual void A(...) = 0;
};

class Class : public Interface
{
public:
    virtual void A(int a) override {}
};

Takie coś oczywiście jest błędne, bo kompilator oczekuje parametru

...

, nie

int a

#edit
Myślałem na szablonem:

template<class ...Types>
class Interface
{
public:
    virtual void A(Types ...) = 0;
};

class Class : public Interface<int>
{
public:
    virtual void A(int a) override {}
};

I to będzie działać ale...
Ja mam dwie takie metody i każda z nich może mieć inne argumenty :)

0

Rozwiązaniem jest tutaj wykorzystanie dziedziczenia wielokrotnego.

template<class ...Types>
class Interface
{
public:
    virtual void A(Types ...) = 0;
};

class Class : public Interface<int> , public Interface<int,float>
{
public:
     void A(int a) override {}
     void A(int a, float b) override {}
};

Tylko nie wiem dlaczego miało by to być lepszym rozwiązaniem niż typowe:

class Interface
{
public:
    virtual void A(int) = 0;
    virtual void A(int,float) = 0;
};

class Class : public Interface
{
public:
     void A(int a) override {}
     void A(int a, float b) override {}
};

gdzie w klasie Interface mamy "czarno na białym" wszystkie funkcje które muszą być zaimplementowane w klasie pochodnej.
Natomiast definicja virtual void A(Types ...) = 0; nie mówi nam nic na temat tego co będzie implementowane w klasach pochodnych.

5

To mi wygląda na problem XY.
Opisz jaki problem w twoim kodzie ma rozwiązać ten wynalazek.

poza tym:

  1. używanie starego "variadic arguments" ( z C) we współczesnym C++ jest uznawane za poważny błąd.
  2. w C++ pełną nazwę funkcji stanowi, nie tylko jawna nazwa funkcji, ale też typy argumentów (Google: C++ name mangling)
  3. Twój koncept jest bezsensu i jest naruszeniem przyczyny istnienia polimorfizmu. Interfejs jest deklaracją wymagań dla klas pochodnych. Realizując wersje tylko z int naruszasz ten kontrakt.
3

Nie jestem mistrzem C++, ale w Javie zrobiłbym to tak że wszystkie parametry, które chcesz przekazać do metody zebrałbym w jedną strukturę i zrobił generyczną metodę od tego jednego parametru

0

Może lepiej przekazać const vector<int> &arr ?
Ewentualnie const vector<Types> &arr

1 użytkowników online, w tym zalogowanych: 0, gości: 1