Суперкласс для шаблона класс фу - PullRequest
1 голос
/ 30 апреля 2020

Предположим, у меня есть шаблон класса

template <int v>
class Foo {...}

У меня есть функция

void f(...)

, которая принимает в качестве входных данных любой объект Foo <1>, Foo <2> et c, как я могу определить функцию? Кажется, что

void f(Foo x) 

не компилируется. Что является общим типом для Foo <1>, Foo <100>, ... и всех Foo?

Ответы [ 3 ]

5 голосов
/ 30 апреля 2020

Что является общим типом для Foo <1>, Foo <100>, ... и всех Foo?

Не существует общего типа. Однако вы можете сделать f шаблоном

template <int v>
void f(Foo<v> x)
{
    //code here
} 

, как указано выше, и теперь функция будет принимать любые Foo, которые вы ему дадите.

1 голос
/ 30 апреля 2020

Как уже отмечалось, вы можете использовать существующее определение Foo и использовать шаблонную функцию foo.

Если вы действительно хотите использовать общий тип для всех экземпляров вашего шаблона Foo, вы должны добавить его как Базовый класс Foo.

class FooBase {...};

template<int v>
class Foo : public FooBase {...};

Затем вы можете написать функцию foo, которая принимает указатель или ссылку на базовый класс. Но это имеет смысл, только если вы добавите в базовый класс виртуальную функцию, которую вы переопределите в шаблонном классе Foo:

#include<iostream>

class FooBase {
  public:
    virtual int doubleIt() const = 0;
};

template<int v>
class Foo : public FooBase {
  public:
   int doubleIt() const {return 2*v;}
};

void foo(FooBase* x) {
  int d = x->doubleIt();
  std::cout << "x->double() is " << d << std::endl;
  // do stuff with d
}

int main() {
    Foo<2> a;
    foo(&a);

    Foo<3> b;
    foo(&b);
}

Демонстрационный код

1 голос
/ 30 апреля 2020

Вам просто нужно сделать f шаблон тоже:

template <int v>
void foo(Foo<v> x)
{
    // code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...