2016-12-06 6 views
0

Прямо сейчас у меня есть две последние проблемы с первой частью моей библиотеки. И первая одна эта вещь не возможно в C++ без взлома (если я хочу версию constexpr), это производный класс счетчик:Автоматический счетчик для производного класса/Альтернатива?

class FooBase { 

    protected: 
    static int Counter; 
}; 

class Foo : public FooBase { 

    public: 
    static const int Type; 
}; 

const int Foo::Type = ++FooBase::Counter; 

struct FooTest : public Foo {}; 

Должно быть в исходном файле:

int FooBase::Counter = 0; 

Зачем мне этот счетчик? Я использую его как тип и индекс в другой массив.

У меня есть две проблемы с этим:

  • Type не constexpr, но эта вещь кажется not really possible
  • У меня есть только строки кода, которые должны быть введены в исходный файл моего целого библиотека

Я знаю, сколько производного класса существует (с макросом, который не является ужасным), если это может помочь, но я не имею ни малейшего представления о чем-то лучшем.

Даже если это означает добавить класс или что-то еще, я хотел бы видеть ваши предложения . Если вы можете хотя бы удалить линию int FooBase::Counter = 0;, это будет хорошо.

PS: У меня нет ограничений на C++, TS приветствуются.

PSS: Настоящий случай немного сложнее и использует CRTP, я надеюсь, что это не будет проблемой.

+0

С помощью этой настройки вы не можете. Я не понимаю, что с ним не так. Это настройка наследования, поэтому ваш дочерний класс может использовать счетчик из родительского класса. Или вы можете просто использовать векторы и использовать size() functoin –

+0

Я никогда не говорил, что не могу его использовать, вот что я делаю прямо сейчас. Я поставил проблему более явным образом. –

+0

http://stackoverflow.com/a/8596825/1561291 это может быть решение, которое вы ищете. –

ответ

0

В принципе невозможно, чтобы счетчик производного класса являлся константой времени компиляции. Причина в том, что компилятор не может знать при компиляции одной единицы перевода, сколько производных классов находится в других единицах перевода или в каком порядке вы их свяжете.

Хуже того, вы можете принять некоторые объектные файлы, содержащие производные классы, в динамическую библиотеку, которую вы загружаете во время выполнения. В этом случае общее число производных классов может меняться в течение времени выполнения программы. И, опять же, компилятор не может определить, так ли это.

Итак, что вы видите, не является конкретным недостатком языка C++, а является фундаментальным ограничением отдельной модели компиляции. Это означает, что если вы хотите это сделать, вам нужно написать внешний инструмент, работающий на полном исходном коде для генерации выражений инициализатора переменных constexpr.

+0

инструмент, который собирается создать заголовок с некоторым значением и использовать его внутри кода, хорошо, я думал о чем-то подобном в будущем для других вещей, но да, я сделаю это прямо сейчас. Благодаря :) –