Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.219.132.107] |
|
Страницы: (33) « Первая ... 14 15 [16] 17 18 ... 32 33 ( Перейти к последнему сообщению ) |
Сообщ.
#226
,
|
|
|
Да. Но задача все же выеденного яйца не стоит. Очень уж исскуственная.
|
Сообщ.
#227
,
|
|
|
Цитата applegame @ Да. Но задача все же выеденного яйца не стоит. Очень уж исскуственная. Ну это просто пример. В принципе, тут можно обеспечить более крутые проверки. А суть в том, что в C++ нет настоящего параметрического полиморфизма, лишь имитация посредством шаблонов(да, они во многом позволяют делать более крутые вещи, чем дженерики или полиморфные типы). |
Сообщ.
#228
,
|
|
|
Цитата D_KEY @ Как мы уже выяснили, это зависит от того, что понимать под понятием ПП. Я, лично считаю, что это самый что ни на есть настоящий параметрический полиморфизм. А суть в том, что в C++ нет настоящего параметрического полиморфизма Добавлено Цитата D_KEY @ Тут только одно ограничение - рекурсивное инстанцирование. на этом более крутые проверки заканчиваются. Ну это просто пример. В принципе, тут можно обеспечить более крутые проверки. |
Сообщ.
#229
,
|
|
|
Цитата applegame @ Как мы уже выяснили, это зависит от того, что понимать под понятием ПП. Я, лично считаю, что это самый что ни на есть настоящий параметрический полиморфизм. А почему ты так считаешь? Я считаю, что нет, т.к. все портит специализация и перегрузка, которая делает код обобщенной функции/класса зависимым от типов-параметров, что прямо противоречит определению ПП Добавлено Цитата applegame @ Тут только одно ограничение - рекурсивное инстанцирование. Источник проблемы вообще в том, что нужно инстанцировать. А корень требования инстанцирования в том, что есть зависимость шаблонного кода от параметров(чего нет в случае ПП). |
Сообщ.
#230
,
|
|
|
Цитата D_KEY @ А я не считаю, что портит. Ты же не обязан специализировать и перегружать. Не пурегружай и не специализируй и будет тебе ПП. А то у тебя получается, что автомобиль с крыльями - уже не автомобиль, потому что крылья позволяют летать, а автомобиль по определению не летает.Я считаю, что нет, т.к. все портит специализация и перегрузка, Цитата D_KEY @ Это ничего не меняет. По сути все равно как там разворачиваются шаблоны внутри, пока дело не доходит до рекурсии. И, по моему глубокому убеждению это никак не связано с "истинностью" ПП. Вооще никак. Это просто недостаток C++. Источник проблемы вообще в том, что нужно инстанцировать. А корень требования инстанцирования в том, что есть зависимость шаблонного кода от параметров(чего нет в случае ПП). |
Сообщ.
#231
,
|
|
|
Цитата applegame @ А я не считаю, что портит. Ты же не обязан специализировать и перегружать. Не пурегружай и не специализируй и будет тебе ПП. Не будет, так как компилятор будет инстанцировать и зависимость никуда не уйдет. Цитата А то у тебя получается, что автомобиль с крыльями - уже не автомобиль, потому что крылья позволяют летать, а автомобиль по определению не летает. Если крылья мешают ездить, то да, это не автомобиль. |
Сообщ.
#232
,
|
|
|
Ничего не скажет - не получится там это реализовать.
enum List { Cons(u32, Box<List>), Nil, } Значения внутри enum считаются именно значениями, а не типами, так что специализацию для них (пока?) сделать не получится. А если делать реализацию для ScalarProduct, то и проверки длины придётся делать руками. Например, как это сделано тут. |
Сообщ.
#233
,
|
|
|
Цитата DarkEld3r @ Значения внутри enum считаются именно значениями, а не типами, так что специализацию для них (пока?) сделать не получится. Но можно же сделать разные типы для Nil и Cons. |
Сообщ.
#234
,
|
|
|
Цитата D_KEY @ А тебе то какое дело до того что там делает компилятор? Ты смотри на исходники.Не будет, так как компилятор будет инстанцировать и зависимость никуда не уйдет. Цитата D_KEY @ Тебе мешает специализация и перегрузка? Если крылья мешают ездить, то да, это не автомобиль. |
Сообщ.
#235
,
|
|
|
Цитата applegame @ Цитата D_KEY @ А тебе то какое дело до того что там делает компилятор?Не будет, так как компилятор будет инстанцировать и зависимость никуда не уйдет. В том-то и дело, что с ПП мне все равно, что там будет делать компилятор. А в случае с шаблонами - нет. Мне нужно знать, что зависит от параметра шаблона, а что нет, подхватит ли он нужные мне перегрузки и специализации или нет. И т.д. Цитата Цитата D_KEY @ Тебе мешает специализация и перегрузка?Если крылья мешают ездить, то да, это не автомобиль. Она мне помогает Но ПП она мешает, да. |
Сообщ.
#236
,
|
|
|
Цитата D_KEY @ Полагаю это твои личные заморочки. Я начинаю задумываться о глубинах компилятора, только когда что-то оптимизирую или пишу нечто не укладывающееся в ПП. Может этому способствует более приятный синтаксис D, не знаю. А в случае с шаблонами - нет. Мне нужно знать, что зависит от параметра шаблона, а что нет, подхватит ли он нужные мне перегрузки и специализации или нет. И т.д. |
Сообщ.
#237
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Полагаю это твои личные заморочки.А в случае с шаблонами - нет. Мне нужно знать, что зависит от параметра шаблона, а что нет, подхватит ли он нужные мне перегрузки и специализации или нет. И т.д. Вообще-то это нужно знать, чтобы решать задачи. Просто ты, как правило, итак это держишь в голове, потому отдельно не обдумываешь. Но тебе нужно знать, что template<typename T> void foo(T x) { bar(x); } Вызовет подходящий bar. А в более сложных случаях(методы, неймспейсы и поиск Кенига, перегрузки, специализации и пр. и пр.), это не так просто понять. |
Сообщ.
#238
,
|
|
|
Цитата D_KEY @ Как? Вот тут список - это или конец списка или значение и указатель на список: Но можно же сделать разные типы для Nil и Cons. enum List { Cons(u32, Box<List>), Nil, } struct Nil; struct Cons(u32, Box<???>); В общем, или я туплю где-то или всё-таки не получится. |
Сообщ.
#239
,
|
|
|
Цитата DarkEld3r @ Цитата D_KEY @ Как? Вот тут список - это или конец списка или значение и указатель на список: Но можно же сделать разные типы для Nil и Cons. enum List { Cons(u32, Box<List>), Nil, } struct Nil; struct Cons(u32, Box<???>); В общем, или я туплю где-то или всё-таки не получится. Там в ЖЖ код на C#, на дженериках. using System; interface ScalarProduct<A> { int scalarProduct(A second); } class Nil : ScalarProduct<Nil> { public Nil(){} public int scalarProduct(Nil second) { return 0; } } class Cons<A> : ScalarProduct<Cons<A>> where A : ScalarProduct<A> { public int value; public A tail; public Cons(int _value, A _tail) { value = _value; tail = _tail; } public int scalarProduct(Cons<A> second){ return value * second.value + tail.scalarProduct(second.tail); } } class _Test{ public static int main(int n){ return _main(n, 0, new Nil(), new Nil()); } public static int _main<A>(int n, int i, A first, A second) where A : ScalarProduct<A> { if (n == 0) { return first.scalarProduct(second); } else { return _main(n-1, i+1, new Cons<A>(2*i+1,first), new Cons<A>(i*i, second)); // Works //return _main(n-1, i+1, first, new Cons<A>(i*i, second)); // Doesn't work } } } public class Test{ public static void Main(){ Console.Write("Enter a number: "); int val = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(_Test.main(val)); } } |
Сообщ.
#240
,
|
|
|
Цитата D_KEY @ Нет не нужно. Этот bar вообще может быть в сторонней либе, и мне по сути совершенно все равно, как оно там реализовано: перегрузкой, просто шаблоном или шаблоном с частичной специализацией. Для меня это будет полиморфная функция bar. Но тебе нужно знать, что template<typename T> void foo(T x) { bar(x); } Вызовет подходящий bar. Добавлено Тут вот еще Qraizer задавал вопрос, мне тоже интересно. Что значит полиморфный тип? Кто-нибудь может дать внятное определение, на основании которого можно было бы утверждать, что T в шаблоне - это не полиморфный тип. |