Недавно я нашел версию sbi из решение Корнела , которое очень полезно. Спасибо вам обоим за предоставленные ответы. Однако я хотел бы расширить решение, чтобы несколько типов идентификаторов можно было легко создавать без создания отдельной пары классов id_impl и id_base для каждого нового типа.
Для этого я шаблонизировал класс id_impl и добавил еще один аргумент в id_base. Результат инкапсулируется в заголовочный файл, который включается везде, где требуется добавить новый тип идентификатора:
//idtemplates.h
template< class T >
class GeneralID
{
private:
GeneralID() {}
static int GetNextID()
{
static int counter = 0;
return ++counter;
}
template< class T, class U >
friend class GeneralIDbase;
};
template< class T, class U >
class GeneralIDbase : private GeneralID < T >
{
public:
static int GetID() { return ID; }
private:
static int ID;
};
template< class T, class U >
int GeneralIDbase<T, U>::ID = GetNextID();
Для моего приложения я хотел, чтобы несколько абстрактных базовых классов имели связанный с ними тип идентификатора. Поэтому для каждого экземпляра шаблона GeneralIDbase указываются следующие типы: абстрактный базовый класс объявленного производного класса и объявленный производный класс.
Примером является следующий файл main.cpp:
//main.cpp
#include<iostream>
#include<idtemplates.h>
using namespace std;
class MyBaseClassA {};
class MyBaseClassB {};
class MyClassA1 :public MyBaseClassA, public GeneralIDbase<MyBaseClassA, MyClassA1> {};
class MyClassA2 :public MyBaseClassA, public GeneralIDbase<MyBaseClassA, MyClassA2> {};
class MyClassB1 :public MyBaseClassB, public GeneralIDbase<MyBaseClassB, MyClassB1> {};
class MyClassB2 :public MyBaseClassB, public GeneralIDbase<MyBaseClassB, MyClassB2> {};
int main()
{
MyClassA1 objA1;
MyClassA2 objA2;
cout << "objA1.GetID() = " << objA1.GetID() << endl;
cout << "objA2.GetID() = " << objA2.GetID() << endl;
MyClassB1 objB1;
MyClassB2 objB2;
cout << "objB1.GetID() = " << objB1.GetID() << endl;
cout << "objB2.GetID() = " << objB2.GetID() << endl;
cin.get();
return 0;
}
Вывод этого кода
/*
objA1.GetID() = 1
objA2.GetID() = 2
objB1.GetID() = 1
objB2.GetID() = 2
*/
Надеюсь, это поможет! Пожалуйста, дайте мне знать о любых проблемах.