Допустим, есть базовый класс, он наследуется от реализации. Не совсем понятно, что делать, если Реализация подразумевает использование аргументов в конструкторе. Ну, например: Код (Text): template <class T_Impl> class CBase : private T_Impl { public: CBase() {} }; class CImpl1 { public: CImpl1(int x) {} }; class CImpl2 { public: CImpl2() {} }; typedef CBase<CImpl1> Cx1; typedef CBase<CImpl2> Cx2; такой код не соберётся. Оно и понятно - конструктор CImpl1 требует аргумент x. Единственное, что приходит на ум - метод initialize() у класса Impl. Тгогда class CBase : public T_Impl. В общем, не знаю как лучше.
cupuyc В рамках C++03 это делается только так: Код (Text): template <class T_Impl> class CBase : private T_Impl { public: CBase() {} template <class P1> CBase(P1 p1) : T_Impl(p1) { } template <class P1, class P2> CBase(P1 p1, P2 p2) : T_Impl(p1, p2) { } template <class P1, class P2, class P3> CBase(P1 p1, P2 p2, P3 p3) : T_Impl(p1, p2, p3) { } // И так далее }; В рамках C++0x, возможно, это можно будет разрулить более компактно через Variadic Templates. Будет более понятно, когда стандарт будет окончательно утвержден.
cupuyc ИМХО, если не стоит задача обобщить такое безобразие - можно запихать в иерархию что-то вроде адаптера: Код (Text): template <class T> struct BaseAdapter : public T { }; template <class T_Impl> class CBase : private BaseAdapter<T_Impl> { public: CBase() {} }; class CImpl1 { public: CImpl1(int x) {} }; class CImpl2 { public: CImpl2() {} }; template <> struct BaseAdapter<CImpl2> : public CImpl2 { BaseAdapter() : CImpl2(600) { } }; typedef CBase<CImpl1> Cx1; typedef CBase<CImpl2> Cx2; Хотя некрасиво это - если концепция сопротивляется, значит в ней чего-то не додумано.
Хех.. Так в этом вся проблема. То ли концепция не додумана (в чём я сомневаюсь, её ведь всякие умные бородатые программисты выдумывали) то ли у меня в голове не всё по полкам разложено.