На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 337 338 [339] 340 341 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата korvin @
    <T extends Super>
    Шо оно делает?
      Цитата Повстанець @
      Цитата korvin @
      <T extends Super>
      Шо оно делает?

      гарантирует, что T является субклассом Super
        Цитата korvin @
        кстати, я что-то пропустил, или в шаблонах уже можно ограничивать значение классового параметра? а ля <T extends Super> ?

        Специального синтаксиса не было и не будет - этот функционал можно сделать и так. Более того, можно специализировать поведения в зависимости от того, какой класс базовый и т.д. и т.п. Но все руками(или с помощью библиотек, таких как boost).
          Цитата korvin @
          кстати, я что-то пропустил, или в шаблонах уже можно ограничивать значение классового параметра? а ля <T extends Super> ?

          Непосредственно синтаксис плюсов такую возможность не поддерживает. Однако это делается другими шаблонами :)
          ExpandedWrap disabled
            template<class T>
            class A
            {
              BOOST_STATIC_ASSERT_MSG(boost::is_base_of<Base, T>::value, "Error")
            };

          Ну, всё тоже самое есть в C++11, и static assert там не макрос, а обычная языковая конструкция.

          Добавлено
          Цитата D_KEY @
          Но все руками(или с помощью библиотек, таких как boost).

          C++11 же :) Там страниц 17 стандарта таких шаблонов :)
          Сообщение отредактировано: MyNameIsIgor -
            Цитата MyNameIsIgor @
            Ну, всё тоже самое есть в C++11, и static assert там не макрос, а обычная языковая конструкция.

            всмысле функция?
              Цитата korvin @
              всмысле функция?

              В смысле, языковая конструкция. ;)
                Цитата korvin @
                всмысле функция?

                Нет. Декларация. Статическая проверка. Как-то так.
                  ExpandedWrap disabled
                    static_assert(std::is_base_of<Base, T>::value, "Error");

                  :lol: красота
                    Цитата IL_Agent @
                    красота

                    Сам фшоке. Все три с половиной года моего мучения недошарпом хотел такую красоту вместе с возможностью специализировать недодженерики.
                    Оказалось, что проще перейти на плюсы, чем дождаться такой элементарщины.
                      А дженерики не специализируются? О боже :wacko:
                        Цитата MyNameIsIgor @
                        Сам фшоке. Все три с половиной года моего мучения недошарпом хотел такую красоту вместе с возможностью специализировать недодженерики.
                        Оказалось, что проще перейти на плюсы, чем дождаться такой элементарщины.

                        эм... а как тут специализация будет выглядеть?
                          Цитата korvin @
                          эм... а как тут специализация будет выглядеть?

                          Ну, если мне с наследниками Base работать одним способом, а с остальными - другим. Что-то вроде этого.

                          Добавлено
                          Ну, или без специализации с помощью шаблона выбора типа - так.
                            а если нужно несколько специализаций? могу ли я, подключив твой файл (без main) как .h, написать специализации для своих классов и как? если я напишу специализацию для Derived, как B определит, какую специализацию выбрать -- Base или Derived, если я передам наследника Derived?
                              Цитата korvin @
                              а если нужно несколько специализаций? могу ли я, подключив твой файл (без main) как .h, написать специализации для своих классов и как? если я напишу специализацию для Derived, как B определит, какую специализацию выбрать -- Base или Derived, если я передам наследника Derived?

                              Да, такое возможно. Например, можно сделать класс с какими-то деталями реализации
                              ExpandedWrap disabled
                                template<class T>
                                class impl
                                {
                                public:
                                  void f() { /*какая-то дефолтная реализация */ }
                                };
                                 
                                template<class T>
                                class A
                                {
                                  typedef impl<T> impl_type;
                                  //как-то юзаем реализацию
                                };

                              Подключив такой .h, вы можете специализировать impl по своему желанию
                              ExpandedWrap disabled
                                template<>
                                class impl<some_class>
                                {
                                public:
                                  void f() { /* реализация для some_class */ }
                                };
                                 
                                A<some_class> a;
                                а чем тебя не устраивает
                                ExpandedWrap disabled
                                  class Impl<T> {
                                      public void f() { /* какая-то дефолтная реализация */ }
                                  }
                                   
                                  class A<T> {
                                      // как-то юзаем реализацию
                                  }
                                   
                                  class Some {
                                  }
                                   
                                  class SomeImpl extends Impl<Some> {
                                      public void f() { /* реализация для Some */ }
                                  }

                                ?

                                например
                                ExpandedWrap disabled
                                  class Impl<T> {
                                      public void f() {
                                          System.out.println("Default");
                                      }
                                  }
                                   
                                  class A<T> {
                                      private Impl<T> impl;
                                   
                                      public A(Impl<T> impl) {
                                          this.impl = impl;
                                      }
                                   
                                      public void use() { impl.f(); }
                                  }
                                   
                                  class Some {
                                  }
                                   
                                  class SomeImpl extends Impl<Some> {
                                      public void f() {
                                          System.out.println("Some");
                                      }
                                  }
                                   
                                  public class Main {
                                      public static void main(String[] args) {
                                          A<String> aString = new A<>(new Impl<String>());
                                          A<Some>   aSome   = new A<>(new SomeImpl());
                                          aString.use();
                                          aSome.use();
                                      }
                                  }

                                ExpandedWrap disabled
                                  Default
                                  Some
                                Сообщение отредактировано: korvin -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 337 338 [339] 340 341 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5086 ]   [ 15 queries used ]   [ Generated: 31.07.26, 11:40 GMT ]