почему "SomeType globalVar = cast (SomeType) import (" путь / к / файлу ")" не работает? - PullRequest
1 голос
/ 04 августа 2020

как сказано в названии, почему

SomeType globalVar = cast(SomeType) import("path/to/file")

не работает? и результат на cannot cast `"..."` to `SomeType` at compile time

спасибо.

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Для этого может быть много причин. import выражений создает строковый литерал. Компилируется ли cast(SomeType)"some other string"? Если да, то является ли текст в /path/to/file допустимой строкой для SomeType, из которой нужно создать? Есть ли у SomeType соответствующий конструктор, который принимает строку?

Этот код компилируется:

struct S {
    this(string s) {}
}

S globalS = cast(S)"foo";

Удаление конструктора S 'приводит к описанному вами сообщению об ошибке. Это заставляет меня думать, что SomeType не имеет конструктора с соответствующей подписью, но об этом трудно сказать, не зная больше вашего кода и содержимого импортируемого файла.

1 голос
/ 07 августа 2020

Он будет работать, если SomeType - правильный тип.

Результатом import("some/path") будет string. Вы не можете разыграть string на struct. Но в вашем случае это, вероятно, двоичные данные, а не фактический текстовый файл. Вы можете сделать следующее:

// Load the file and convert it to `immutable(ubyte[])`
immutable ubyte[] manifestBinaryData = cast(immutable ubyte[]) import("path/to/file");

// Safety check, you can even add an error message with expected and actual size
static assert(manifestBinaryData.length >= SomeType.sizeof);

// Equivalent to a reinterpret_cast in C++. The compiler will not check anything.
immutable SomeType* myFont = cast(immutable SomeType*) manifestBinaryData.ptr;

Вы можете делать более умные вещи: например, вы можете анализировать / обрабатывать данные во время компиляции, если хотите. Но я считаю, что приведенный выше фрагмент наиболее близок к вашим намерениям.

...