Инициализация статического const в классе, который расширяет шаблон - PullRequest
2 голосов
/ 24 марта 2011

Рассмотрим этот псевдокод:

class Foo {
public:
    virtual int getID() const = 0;
}

template<typename T>
class Blah : public Foo {
public:
    T data;
    static const int ID;  //static ID
    int getID() const { return Blah<T>::ID; }  //instance returns the ID
}

class Dude : public Blah<int> {
}
int Dude::ID = 10;  //I want to define Blah<int>::ID here, but how?

int receive(const Foo& foo) {
    if(foo.getID() == Dude::ID) {
        cout << "Received a Dude" << endl;
    }
}

Этот фрагмент кода не может быть скомпилирован, поскольку ISO C ++ не позволяет идентифицировать идентификатор в шаблоне Blah как идентификатор в классе Dude.Я понимаю почему, потому что у меня может быть несколько классов, которые расширяют Blah<int>.

. Я понимаю, что если поставить template<typename T> int Blah<T>::ID = 10' in the Blah<T>, подразумевается, что это будет работать ... но это не то, что я хочу ... Яхочу, чтобы производный класс определял идентификатор ...

Нужно ли вставлять идентификатор и getID () в производный класс?Я предполагаю, что в конечном итоге мне интересны некоторые RTTI, чтобы я мог обработать Foo соответствующим образом.Если у кого-то есть лучшая модель, у меня все уши.

РЕДАКТИРОВАТЬ В ответ на некоторые комментарии ... Я хотел бы однозначно определить классы, которые происходят от Foo черезнекоторый идентификатор, чтобы я мог сравнить идентификатор времени выполнения некоторого Foo объекта с определенным идентификатором класса.

Спасибо!

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Сделать статический int ID;частный, и предоставьте GetID в общедоступном интерфейсе, сделайте SetID защищенным интерфейсом.Но это не очень хорошее решение, потому что все производные классы будут иметь один и тот же идентификатор, а это не то, что вам нужно.

Лучше было бы использовать идентификатор в качестве параметра шаблона базового класса, тогдаКласс Derived: public Base <234> {} будет работать.

Или добавьте виртуальный const int GetID () = 0 в базовый класс.

0 голосов
/ 24 марта 2011

Я нашел этот ответ, который делает именно то, что мне нужно ... извините, если мой вопрос сбил с толку.

в C ++, как использовать синглтон, чтобы гарантировать, что каждый класс имеет уникальныйинтегральный идентификатор?

0 голосов
/ 24 марта 2011

Я думаю, вы можете просто сделать это:

class Dude : public Blah<int> {
}
 static const int Dude_ID; //declaration!

int receive(const Foo& foo) {
    if(foo.getID() == Dude::Dude_ID) {
        cout << "Received a Dude" << endl;
    }
}
static const int Dude::Dude_ID = 10; // definition!

Аналогичным образом определите идентификатор для каждого производного класса.


Еще один способ иметь идентификатор для каждого класса - это:

template<typename T, int ID=1>
class Blah : public Foo {
public:
    int getID() const { return ID; }  
}

template<int ID=10>
class Dude : public Blah<int> {
public:
    int getID() const { return ID; }  
}
...