Объявите член класса во время выполнения в D - PullRequest
2 голосов
/ 08 октября 2010

Мне нужна следующая структура в качестве члена класса, но я не знаю тип T, поэтому мне нужно "объявить" структуру во время выполнения.


struct Chunk (T) {
    string id;
    T[][] data;
}

class FileBla {
    this() {
        Chunk !int ck; // need to be turned in a class member
    }
}

Должно что-то пропуститьлегко.

Ответы [ 2 ]

8 голосов
/ 08 октября 2010

Вы можете шаблон класс, а также:

import std.stdio;

struct Chunk (T) {
    string id;
    T[][] data;
}

class FileBla(T) {
private:
    Chunk!T ck;
}

void main() {
    auto f = new FileBla!int;
    writeln(typeid(f.ck));
}
2 голосов
/ 08 октября 2010

Я предполагаю, что вы привыкли к программированию на динамических языках и теперь пытаетесь выучить статический язык.

Существует как минимум три разумных способа сделать это:

ШаблонFileBla тоже:

class FileBla(T) {
    Chunk!T ck;

    // Other stuff.
}

Wrap Chunk в полиморфном классе.

Выделите Chunk в куче и сохраните указатель void* на него.Это старый способ в стиле C, который требует ручного приведения указателя к правильному типу и не безопасен для памяти.Тем не менее, это иногда полезно.

...