Всё бы ничего, но на каждый пустой тип выделяется 1 байт. Штука активно используется для связывания статики и динамики в большом проекте с глубокой иерархией классов и на эти однобайтовые красивости куча памяти уходит. Нахожусь в поисках решения чтобы сильно не пришлось портить устоявшийся интерфейс.
Здравствуйте, glap, Вы писали:
G>Всё бы ничего, но на каждый пустой тип выделяется 1 байт. Штука активно используется для связывания статики и динамики в большом проекте с глубокой иерархией классов и на эти однобайтовые красивости куча памяти уходит. Нахожусь в поисках решения чтобы сильно не пришлось портить устоявшийся интерфейс.
Так непонятно почему бы просто вызов SOMETHING_COOL не перенести в конструктор класса A? Или тебе всё же нужно и в деструкторе вспомогательного класса какие-то действия совершать? Ну тогда можно сделать чтобы один класс от другого наследовался. В идеале сделать класс A наследником такой иерархии — любой современный компилятор позаботится чтобы пустые базовые классы в этом случае никакой памяти не занимали.
Здравствуйте, glap, Вы писали:
G>САБЖ. Нужно для привязывания переменных и геттеров/сеттеров к их строковому эквиваленту времени исполнения.
G>
G>class A
//...
G>#define SOMETHING_COOL(...) \
G>struct UNIQ_NAME \
G>{ \
G> UNIQ_NAME() \
G> { \
G> тут делаем что нужно; \
G> } \
G>} uniq_member_name;
G>
А делать "что нужно" надо для каждого класса А или для каждого экземпляра каждого класса А?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, glap, Вы писали:
G>Для каждого класса А. В конструкторе UNIQ_NAME есть проверка было ли это действие уже произведено.
тогда можно пойти по такому пути:
template<void (*It)()> class CallItOnce {
static struct Caller {
Caller() { It(); }
} callIt;
const char dummy;
public:
CallItOnce() : dummy( (char)&callIt ) {} // хак, что бы гарантировать инстанциацию соответствующего шаблона.
};
template<void (*It)()> CallItOnce<It> CallItOnce<It>::callIt;
// пример:class AZZ {
static int count;
// Это собственно то, что будет генериться внутри твоего макросаstatic void initializer() {
CallItOnce<&initializer> callIt; // продолжение того же хака.
count++;
}
public:
static int Get(){ return count; }
};
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Вызов инициализирующего кода вне конструктора
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, glap, Вы писали:
G>>Для каждого класса А. В конструкторе UNIQ_NAME есть проверка было ли это действие уже произведено.
E>тогда можно пойти по такому пути: ...
Отлично! Спасибо.
Re[5]: Вызов инициализирующего кода вне конструктора
Здравствуйте, glap, Вы писали:
E>>тогда можно пойти по такому пути: ...
G>Отлично! Спасибо.
Не за что, обращайся.
p. s.
Для "спасибо" тут есть кнопки
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Вызов инициализирующего кода вне конструктора
Здравствуйте, Erop, Вы писали:
G>>Для каждого класса А. В конструкторе UNIQ_NAME есть проверка было ли это действие уже произведено. E>тогда можно пойти по такому пути: [c]template<void (*It)()> class CallItOnce { E> static struct Caller { E> Caller() { It(); } E> } callIt; E> const char dummy; E>public: E> CallItOnce() : dummy( (char)&callIt ) {} // хак, что бы гарантировать инстанциацию соответствующего шаблона. E>};
Использование статических мемберов — плохой тон. Можно ненароком шмальнуть себе по ноге из конструктора такого же статического объекта.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
V>Использование статических мемберов — плохой тон. Можно ненароком шмальнуть себе по ноге из конструктора такого же статического объекта.
Вообще инициализации где-то кроме глобальной функции инициализации -- дурной тон.
Но конкретно тут, как планируется шмалять?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Вызов инициализирующего кода вне конструктора
Здравствуйте, Erop, Вы писали:
V>>Использование статических мемберов — плохой тон. Можно ненароком шмальнуть себе по ноге из конструктора такого же статического объекта. E>Вообще инициализации где-то кроме глобальной функции инициализации -- дурной тон. E>Но конкретно тут, как планируется шмалять?
Как обычно делают? Обычно деляют либо инициализацию по вызову функции со статической переменной, либо, ещё лучше, явную инициализацию всего одним явным вызовом по принципу "либо всё, либо ничего", чтобы можно было перенести/пересортировать вызовы различных инициализаций в нужном месте. Такое если выстрелет, то сразу в голову без всяких прилюдий.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: Вызов инициализирующего кода вне конструктора
Здравствуйте, Vain, Вы писали:
E>>Но конкретно тут, как планируется шмалять? V>Как обычно делают? Обычно деляют либо инициализацию по вызову функции со статической переменной, либо, ещё лучше, явную инициализацию всего одним явным вызовом по принципу "либо всё, либо ничего", чтобы можно было перенести/пересортировать вызовы различных инициализаций в нужном месте. Такое если выстрелет, то сразу в голову без всяких прилюдий.
Про то, что явной функцией приложение инициализировать лучше, я не спорю.
Но это вопрос архитектуры приложения, а не тот, который задал ТС...
И таки да, как в данном конкретном случае планируется шмалять?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Вызов инициализирующего кода вне конструктора
Здравствуйте, Vain, Вы писали:
E>>И таки да, как в данном конкретном случае планируется шмалять?.. V>Я ж ответил — явной инициализацией.
Имелось в виду "шмалять в ногу".
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Вызов инициализирующего кода вне конструктора
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, Erop, Вы писали:
V>>>Использование статических мемберов — плохой тон. Можно ненароком шмальнуть себе по ноге из конструктора такого же статического объекта. E>>Вообще инициализации где-то кроме глобальной функции инициализации -- дурной тон. E>>Но конкретно тут, как планируется шмалять? V>Как обычно делают? Обычно деляют либо инициализацию по вызову функции со статической переменной, либо, ещё лучше, явную инициализацию всего одним явным вызовом по принципу "либо всё, либо ничего", чтобы можно было перенести/пересортировать вызовы различных инициализаций в нужном месте. Такое если выстрелет, то сразу в голову без всяких прилюдий.
Наверное надо отталкиваться от задачи, а не от каких-то эфемерных подводных камней. Моя задача так решается и избавляет меня от необходиомости для каждого класса, коих больше сотни, писать инициализацию из другого модуля. Забыть её сделать реальная опасность, а ваша выдуманная, т.к. вне контекста.
Re[2]: Вызов инициализирующего кода вне конструктора
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, glap, Вы писали:
G>>П.С. G>>C++0x11 не доступен. A>что если С++17 не доступен, то уж 14 или 11-то доступны? так там NSDMI есть
За что минус влепил? Ещё и бред какой-то написав в ответ.
Мне недоступен современный цпп. Тебе очень интересно причина или к чему это написано?