Это выглядит как хороший пример реализации интеллектуального указателя на основе политик: ссылка . Андрей Александреску описывает реализацию интеллектуального указателя на основе политик в одной из своих книг. Что касается ваших вопросов сейчас. У меня есть некоторый опыт в этом деле, но этого недостаточно, чтобы воспринимать мои слова как должное:
Объявление 1 и 4. Я предполагаю, что основанный на политике дизайн - это больше шаблоны, чем наследование. Вы пишете класс шаблона, а аргументы шаблона - это классы политики, например:
template<class FooPolicy, class BarPolicy>
class Baz {
// implementation goes here
};
Затем вы используете методы из классов политики в вашем классе:
void Baz::someMethod(int someArg) {
FooPolicy::methodInit();
// some stuff
BarPolicy::methodDone();
}
Я использую статические методы в этом примере, потому что часто политика не требует какого-либо состояния. Если это так, вы включаете состояние политики по составу, а не по наследству:
template<class FooPolicy, class BarPolicy>
class Baz {
private:
FooPolicy::State fooState; // might require 'typename' keyword, I didn't
// actually tried this in any compiler
// rest of the Baz class
};
Объявление 2. Вы можете написать шаблон специализации - для конкретной комбинации основного класса и его политик вы можете написать специальную версию любого метода или конструктора, AFAIK:
template <>
Baz<SomeConcreteFooPolicy, SomeConcreteBazPolicy>::Baz(someArgument)
: fooState(someArgument)
{
// stuff here
}
Надеюсь, это вам немного поможет,
Mike