статический полиморфизм. конструктор с параметрами.

Тема в разделе "LANGS.C", создана пользователем cupuyc, 31 май 2010.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Допустим, есть базовый класс, он наследуется от реализации. Не совсем понятно, что делать, если Реализация подразумевает использование аргументов в конструкторе. Ну, например:

    Код (Text):
    1. template <class T_Impl>
    2. class CBase :
    3.   private T_Impl
    4. {
    5. public:
    6.   CBase() {}
    7. };
    8.  
    9. class CImpl1
    10. {
    11. public:
    12.   CImpl1(int x) {}
    13. };
    14.  
    15. class CImpl2
    16. {
    17. public:
    18.   CImpl2() {}
    19. };
    20.  
    21. typedef CBase<CImpl1> Cx1;
    22. typedef CBase<CImpl2> Cx2;
    такой код не соберётся. Оно и понятно - конструктор CImpl1 требует аргумент x. Единственное, что приходит на ум - метод initialize() у класса Impl. Тгогда class CBase : public T_Impl. В общем, не знаю как лучше.
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    В рамках C++03 это делается только так:

    Код (Text):
    1. template <class T_Impl>
    2. class CBase : private T_Impl
    3. {
    4. public:
    5.  
    6.   CBase() {}
    7.  
    8.   template <class P1>
    9.   CBase(P1 p1) : T_Impl(p1) { }
    10.  
    11.   template <class P1, class P2>
    12.   CBase(P1 p1, P2 p2) : T_Impl(p1, p2) { }
    13.  
    14.   template <class P1, class P2, class P3>
    15.   CBase(P1 p1, P2 p2, P3 p3) : T_Impl(p1, p2, p3) { }
    16.  
    17.   // И так далее
    18.  
    19. };
    В рамках C++0x, возможно, это можно будет разрулить более компактно через Variadic Templates. Будет более понятно, когда стандарт будет окончательно утвержден.
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    cupuyc
    ИМХО, если не стоит задача обобщить такое безобразие - можно запихать в иерархию что-то вроде адаптера:
    Код (Text):
    1. template <class T>
    2. struct BaseAdapter
    3.     : public T
    4. {
    5. };
    6.  
    7. template <class T_Impl>
    8. class CBase :
    9.   private BaseAdapter<T_Impl>
    10. {
    11. public:
    12.   CBase() {}
    13. };
    14.  
    15. class CImpl1
    16. {
    17. public:
    18.   CImpl1(int x) {}
    19. };
    20.  
    21. class CImpl2
    22. {
    23. public:
    24.   CImpl2() {}
    25. };
    26.  
    27. template <>
    28. struct BaseAdapter<CImpl2>
    29.     : public CImpl2
    30. {
    31.     BaseAdapter()
    32.         : CImpl2(600)
    33.     {
    34.     }
    35. };
    36.  
    37. typedef CBase<CImpl1> Cx1;
    38. typedef CBase<CImpl2> Cx2;
    Хотя некрасиво это - если концепция сопротивляется, значит в ней чего-то не додумано. :)
     
  4. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Хех.. Так в этом вся проблема. То ли концепция не додумана (в чём я сомневаюсь, её ведь всякие умные бородатые программисты выдумывали) то ли у меня в голове не всё по полкам разложено.