Нужна идея, как реализовать такое: Есть шаблонная функция, которая регистрирует тип при запуске программы. Хочется сделать так, чтоб если мы в двух разных местах программы пытаемся зарезистрировать один и тот же тип, то сборка ломается. Сейчас такая проверка происходит в момент запуска. Примерное использование в коде такое:
// Module1.cpp
void Module1::initModule()
{
...
registerType<AAA>(Factory1());
registerType<BBB>([this]() { return this->createBBB();});
...
}
// Module2.cpp
void Module2::initModule()
{
...
registerType<CCC>([]() { return CCCImpl(); });
registerType<AAA>(Factory2()); // <- Вот тут на линковке(?) должно сломаться
...
}
UPD: Уточнение. Типы AAA, BBB, CCC это интерфейсы и определены заранее и не обязательно в том модуле где вызывается регистрация. В момент регистрации registerType(...) мы по факту передаем правильно сконфигурированную фабрику.
Чтобы "сломалось" на линковке нужно создать в модуле extern (и не weak) символ.
К сожалению, сделать это внутри функции не получится (точнее, я не знаю, как это сделать).
Наверное, проще всего объявить о своих намерениях вне функции, используя макрос, который раскроется в код функции.
Она может реально ниоткуда и не вызываться, хотя для контроля целостности можно (например, тоже макросом) сгенерить код, вызывающий эту функцию внутри вашей registerType<>
.
Макрос может быть примерно таким:
#define USE_REGISTER(name) const char * f_ ## name () { return #name; }
Вы вставляете его в свой файл по одному разу для каждого регистрируемого где-то далее типа.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Проясните пожалуйстаТо что кладется в std::vector оно размещается в динамической памяти (то есть как при вызове new)? Как вообще поместить объекты...
Нужно распарсить строку, для этого необходимо найти позицию знака