Зарегистрировался
Здравствуйте, Masterkent, Вы писали:
А>>Знатоки стандарта, подскажите, пожалуйста, допустима ли следующая конструкция:
А>>А>>...
А>>
M>Так делать нельзя.
M>C++03 — 3.3.6/1:
Спасибо за информацию, осознал

В общем, я и подозревал, что так неправильно, вот только жаль расставаться с уже работающей (в MSVC) во многих местах конструкцией... а поэтому следующий вопрос — а можно ли как-то добиться похожего поведения? Поясню в общих чертах, для чего это нужно. Это используется в некоторых макросах, которые избавляют от необходимости писать некий повторяющийся код при наследовании классов. Схема примерно такая:
struct Base
{
typedef Base ProcessBase_;
virtual void Process() { .../* начальная реализация */ }
};
#define OVERRIDE_PROCESS(ThisClass) \
typedef ProcessClass_ ProcessBase_; \
typedef ThisClass ProcessClass_; \
void Process() { .../* дополнение реализации */; ProcessBase_::Process(); }
struct Derived1 : Base
{
OVERRIDE_PROCESS(Derived1)
};
struct Derived2 : Derived1
{
OVERRIDE_PROCESS(Derived2)
};
Надеюсь, идея ясна — в макросе переопределяется какой-то член базового класса, но при реализации переопределения нужно сослаться на версию из базового класса. При этом жизненно важно избежать необходимости явно указывать при вызове макроса ещё и базовый класс, в этом главная проблема. На самом деле это очень упрощённая версия того, что реально используется — в полной версии переопределяются не только виртуальные функции, но и некоторые статические константы, у макроса есть дополнительные параметры — короче, через шаблоны не получается реализовать. Может кто посоветует, что тут можно предпринять?