1. C++ / Говнокод #7575

    +147

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    template <typename type>
    class some
    {
    
      type val;
    public:
      some( const type &a ) : val(a)
      {  }
      template<typename t>
      some( const some<t> &a )
      {
        val = static_cast<type>(a.val);
      }
      template <typename type>
      friend class some; // иначе ошибка - нет доступа к приватному члену
    };

    Филосовский однако язык. Для того что бы все свои секреты нужно с самим собой подружиться...
    Сбрил усы - дружись с усатым...

    Запостил: Enelar, 17 Августа 2011

    Комментарии (11) RSS

    • >Филосовский
      RAGE!
      Ответить
    • разве можно в с++ по стандарту создавать шаблонных друзей?
      вроде можно только создавать друзей для инстанцированных классов.

      Что-то типа:
      friend class some<int>;
      friend class some<type>;

      а то что выше - не скомпилируется.
      Ответить
      • Поддерживаю. Ведь суть шаблонов - это генерация новых классов во время компиляции.
        Ответить
      • Не помню, что в стандарте, но то, что в Visual Studio это работает - факт.
        Ещё факт, что в студии, начиная, как минимум, с 2005 (более ранние не проверял), можно объявить другом собственный шаблонный аргумент:

        template <typename T>
        class C
        {
        friend T;
        };

        Стандарт, насколько удалось понять, это ранее запрещал по причине каких-то там неоднозначностей, но вроде бы в C++0x уже будет можно официально (пруф сейчас не найду, но упоминание такое встречал). По крайней мере, очень на это надеюсь, а то отличный паттерн пропадает... (ну, не то чтобы прямо пропадает - в студии ж компилится, может, и не только в ней?)
        Ответить
    • >нужно с самим собой подружиться...
      Согласно стандарта С++, каждое инстанцирование шаблона класса - это новый класс, так что в любом случае это не может быть дружбой с самим собой.
      Ответить
      • А это не конструктор копирования по объявленной выше причине:
        template<typename t>
        some( const some<t> &a )

        Вот конструктор копирования:
        some( const some &a )
        притом даже в шаблонном классе, если объявлять его в интерфейсной части класса.
        Ответить
      • Согласно стандартУ.
        Ответить
    • Изрядный говнокодец)
      Констурктор прикольный, это уже не конструктор копий, а просто конструктор приведения типа. Конечно может быть и удобно, но не правильно.
      Ответить
      • В классе по прежнему определён конструктор копирования по умолчанию. Судя по коду, этого скорее всего достаточно.
        Ответить
      • с чего вы все решили что это конструктор копирования у меня?
        и в описании я указывал именно про работу с разными инстанциями.
        Ответить
    • >Для того что бы все свои секреты нужно с самим собой подружиться...
      Ебал её рука?
      Ответить

    Добавить комментарий