Конференция "FreePascal" » Free Pascal generics
 
  • Servy © (19.04.09 02:03) [0]
    Недавно решил попробовать FreePascal, обрадовало наличие generic'ов, которые раскрываются компилятором в compile time. Однако, даже после прочтение ихней pdf'ки не могу понять как сделать следующее:

    Хочу создать два примерно таких generic класса:


    generic TContainer<TData> = class
     function GetIterator: TIterator<TData>;
    end;

    generic TIterator<TData> = class
     constructor Create(FParent: TContainer<TData>)
    end;



    То есть, первый класс использует второй, а второй использует первый. Будь они обычными классами, достаточно было бы forward declaration одного из них вверху другого. Однако, моя попытка это сделать нарвалась на явный отказ компилятора:


     generic TIterator<TData> = class;

     generic TContainer<TData> = class
     type public
       TContainerIterator = specialize TIterator<TData>;
     end;

     generic TIterator<TData> = class
       FField: Integer;
     end;



    TestProj.lpr(23,46) Error: Specialization is only supported for generic types
    (на строке со специализацией TContainerIterator). То есть, при предварительном объявлении того, что, дескать, будет такой generic, как TIterator, компилятор почему-то не считает его generic'ом...

    Попытка обойти этот эффект с помощью интерфейсов тоже не принесла результатов:


     generic ICommonIterator<TData> = interface
     end;

     generic TContainer<TData> = class
     type public
       TContainerIterator = specialize ICommonIterator<TData>;
     end;

     generic TIterator<TData> = class(TInterfacedObject, ICommonIterator)
       FField: Integer;
     end;

     TConcreteContainer = specialize TContainer<Integer>;



    TestProj.lpr(27,53) Fatal: Syntax error, "," expected but ">" found
    (на строке со специализацией TConcreteContainer). Тут, видимо, компилятору становится вообще плохо, раз он думает, что у generic'а стало больше одного параметра.

    Если у кого-то есть идеи, как сделать задуманное мной, буду рад услышать. Или если кто-то в курсе, в какой версии компилятора планируется более адекватная поддержка generic'ов ^_^.

    P.S.
    Система: Windows XP
    Среда разработки: Lazarus
    Версия FPC: 2.2.2
  • Лекс Айрин (12.07.17 20:20) [1]
    можно попробовать так


    //////////////////////////////////////////////////////////
    generic TIterator<TData> = class;

    generic TContainer<TData> = class
    function GetIterator: TIterator<TData>;
    end;

    generic TIterator<TData> = class
    constructor Create(FParent: TContainer<TData>)
    end;
    ////////////////////////////////////////////////////////////

Есть новые Нет новых   [134427   +34][b:0][p:0.001]