Как создать общую статическую переменную для всех экземпляров шаблона басового класса? - PullRequest
0 голосов
/ 21 января 2019

У меня есть базовый класс шаблона, и я хотел бы создать вызов поля id и автоматически увеличивать его для любого экземпляра производных классов, которые наследуются от этого базового класса. Вот моя первая попытка.

namespace {
    template<class T>
    class BaseClass {
        static uint global_id;
    public:
        uint m_id;
        explicit BaseClass(){
            m_id = global_id++;
        }
    };
    template<class T>
    uint BaseClass<T>::global_id = 0;

    class IntClass: public BaseClass<int> {};
    class DoubleClass: public BaseClass<double> {};

}

TEST(Exp, GlobalIdTest) {
    IntClass a;
    DoubleClass b;
    ASSERT_EQ(a.m_id, 0);
    ASSERT_EQ(b.m_id, 1);
}

Этот код, однако, создает отдельный global_id для любой единицы перевода. Есть ли способ иметь один статический global_id для всех единиц перевода, чтобы вышеуказанный тест прошел?

1 Ответ

0 голосов
/ 21 января 2019

Есть ли способ иметь один статический global_id для всех единиц перевода, чтобы вышеупомянутый тест прошел?

Я полагаю, вы можете добавить класс BaseBase (struct?)и пусть все BaseClass наследуются от него.

struct BaseBase
 { static std::size_t  global_id; };

template <typename T>
struct BaseClass : public BaseBase
 {
   std::size_t  m_id;

   BaseClass () : m_id{global_id++}
    { }
 };

std::size_t BaseBase::global_id { 0u };

Ниже приведен пример полной компиляции (упрощенный)

#include <iostream>

struct BaseBase
 { static std::size_t  global_id; };

template <typename T>
struct BaseClass : public BaseBase
 {
   std::size_t  m_id;

   BaseClass () : m_id{global_id++}
    { }
 };

std::size_t BaseBase::global_id { 0u };

struct IntClass : public BaseClass<int>
 { };

struct DoubleClass: public BaseClass<double>
 { };

int main ()
 {
   IntClass    a;
   DoubleClass b;
   IntClass    c;

   std::cout << a.m_id << ' ' << b.m_id << ' ' << c.m_id << std::endl;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...