QUOTE (AHTOXA @ Nov 11 2012, 23:00)

Вообще-то она изначально туда помещена, в объявлении. То, что некоторые компиляторы до сих пор позволяют не указывать это в реализации, не выносит exec() из пространства имён OS.
Ни разу не так. Помещено туда определение шаблона process, а exec просто объявлена внутри process, и её определение вполне без проблем может быть сделано где угодно.
QUOTE (AHTOXA @ Nov 11 2012, 23:00)

А где ты видишь здесь включение? Никакого включения нет. Есть вызов некой функции некоего стороннего объекта из функции exec() другого класса. Какое же это включение?
А я и не говорю, что оно здесь есть. Я его и предлагаю взамен наследования на котором вы настаиваете, хотя в наследовании тут смысла вообще почти нет: из-за того, что exeс статическая, никакое наследование не позволит иметь нормальный объект с инкапсулированными данными внутри - это будет просто пространство имён с "регулировкой" уровня доступа, не более.
QUOTE (AHTOXA @ Nov 12 2012, 02:15)

Йоу! Я придумал, как совместить эти два варианта
Короче, переименовываем в новом варианте process в customProcess, а process объявляем вот так:
CODE
template<TPriority pr, size_t stack_size>
class process : public customProcess<process<pr, stack_size>, pr, stack_size>
{
public:
OS_PROCESS static void exec();
};
И всё! Старый вариант работает, и новый (наследование от customProcess) - тоже.
Получается вообще замечательно: старые проекты все подхватятся без изменений, а в новых пользователь имеет возможность выбрать для себя более удобный вариант.

QUOTE (Сергей Борщ @ Nov 12 2012, 14:13)

Выглядит слабочитаемо. Что мешает завести свой потомок TBaseProcess вне пространства имен OS, оставив в покое родной шаблон?
+1.
QUOTE (Сергей Борщ @ Nov 12 2012, 14:13)

Тут TProc1 передается как параметр шаблона только для того, чтобы в конструкторе взять адрес его exec. Страдает мое чувство прекрасного. Возможно менее разрушительным будет добавить второй конструктор, который получает адрес exec в качестве параметра? Или сделать этот конструктор с параметром единственным, задав ему значение по умолчанию? А в потомке вызывать с адресом своего exec. Тоже некрасиво - забудешь в потомке описать такой конструктор и компилятор не отловит. Не знаю. Хотя отловит - линкер выругается, что не определен exec() в предке... Но такое сообщение неверно описывает причину ошибки.
Да, всяко не очень красиво получается. А главное - ради чего?
QUOTE (Сергей Борщ @ Nov 12 2012, 14:13)

Как вариант - можно добавить обсуждаемую фичу в Extensions. Именно как отдельного наследника TBaseProcess.
Вот это было бы лучше всего. Расширения для того и предназначены, чтобы расширять. Там можно что угодно делать - желающие пусть юзают.
QUOTE (AHTOXA @ Nov 12 2012, 14:48)

Почему слабочитаемо? Всего-то добавлен один-единственный параметр шаблона, который должен иметь функцию exec(). Родной шаблон тоже не пострадал, всего лишь получил одного дополнительного предка. С точки зрения результирующего кода - ничего не изменилось абсолютно. С точки зрения интерфейса, предоставляемого OS::process - тоже полная идентичность.
Единственное, что изменилось - добавился альтернативный способ создания процессов в оси. Имхо, сплошной профит

Не понимаю, чем оно мешает в том виде, как предлагается сейчас?
Ты уже попробовал в реальном коде? Работает? Кодогенерация идентична? Если на все эти вопросы ответ положительный, можно обсудить дальше.
Если хочется нормальной инкапсуляции, то не нужно городить огороды, это делается легко базовыми средствами языка:
CODE
class TSlon
{
...
void exec()
{
for(;;) { ... }
}
...
};
template<> void TProc1::exec() { Slon.exec(); }
Имеем полную
настоящую инкапсуляцию. Кроме того, слонов тут можно катать сколько угодно. И не только слонов, но и мамонтов, бегемотов и весь остальной зоопарк.
В общем, ждём результатов обкатки в железе предложенного варианта (process : public custom_process<...>).
«Отыщи всему начало, и ты многое поймёшь» К. Прутков