Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 337 338 [339] 340 341 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5072
,
|
|
|
|
гарантирует, что T является субклассом Super |
|
Сообщ.
#5073
,
|
|
|
|
Цитата korvin @ кстати, я что-то пропустил, или в шаблонах уже можно ограничивать значение классового параметра? а ля <T extends Super> ? Специального синтаксиса не было и не будет - этот функционал можно сделать и так. Более того, можно специализировать поведения в зависимости от того, какой класс базовый и т.д. и т.п. Но все руками(или с помощью библиотек, таких как boost). |
|
Сообщ.
#5074
,
|
|
|
|
Цитата korvin @ кстати, я что-то пропустил, или в шаблонах уже можно ограничивать значение классового параметра? а ля <T extends Super> ? Непосредственно синтаксис плюсов такую возможность не поддерживает. Однако это делается другими шаблонами ![]() ![]() ![]() 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 стандарта таких шаблонов |
|
Сообщ.
#5075
,
|
|
|
|
Цитата MyNameIsIgor @ Ну, всё тоже самое есть в C++11, и static assert там не макрос, а обычная языковая конструкция. всмысле функция? |
|
Сообщ.
#5076
,
|
|
|
|
Цитата korvin @ всмысле функция? В смысле, языковая конструкция. |
|
Сообщ.
#5078
,
|
|
|
|
![]() ![]() static_assert(std::is_base_of<Base, T>::value, "Error"); красота |
|
Сообщ.
#5079
,
|
|
|
|
Цитата IL_Agent @ красота Сам фшоке. Все три с половиной года моего мучения недошарпом хотел такую красоту вместе с возможностью специализировать недодженерики. Оказалось, что проще перейти на плюсы, чем дождаться такой элементарщины. |
|
Сообщ.
#5080
,
|
|
|
|
А дженерики не специализируются? О боже
|
|
Сообщ.
#5081
,
|
|
|
|
Цитата MyNameIsIgor @ Сам фшоке. Все три с половиной года моего мучения недошарпом хотел такую красоту вместе с возможностью специализировать недодженерики. Оказалось, что проще перейти на плюсы, чем дождаться такой элементарщины. эм... а как тут специализация будет выглядеть? |
|
Сообщ.
#5082
,
|
|
|
|
|
Сообщ.
#5083
,
|
|
|
|
а если нужно несколько специализаций? могу ли я, подключив твой файл (без main) как .h, написать специализации для своих классов и как? если я напишу специализацию для Derived, как B определит, какую специализацию выбрать -- Base или Derived, если я передам наследника Derived?
|
|
Сообщ.
#5084
,
|
|
|
|
Цитата korvin @ а если нужно несколько специализаций? могу ли я, подключив твой файл (без main) как .h, написать специализации для своих классов и как? если я напишу специализацию для Derived, как B определит, какую специализацию выбрать -- Base или Derived, если я передам наследника Derived? Да, такое возможно. Например, можно сделать класс с какими-то деталями реализации ![]() ![]() template<class T> class impl { public: void f() { /*какая-то дефолтная реализация */ } }; template<class T> class A { typedef impl<T> impl_type; //как-то юзаем реализацию }; Подключив такой .h, вы можете специализировать impl по своему желанию ![]() ![]() template<> class impl<some_class> { public: void f() { /* реализация для some_class */ } }; A<some_class> a; |
|
Сообщ.
#5085
,
|
|
|
|
а чем тебя не устраивает
![]() ![]() class Impl<T> { public void f() { /* какая-то дефолтная реализация */ } } class A<T> { // как-то юзаем реализацию } class Some { } class SomeImpl extends Impl<Some> { public void f() { /* реализация для Some */ } } ? например ![]() ![]() 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(); } } ![]() ![]() Default Some |