Соединение строк во время компиляции
Я хочу объединить имена файлов и форматы изображений во время компиляции. Следующий пример не работает, потому что string[]
не может быть оценено при компиляции, я полагаю...
immutable imageFormats = ["bmp", "jpg", "gif", "png"];
template fileNamesWithImageFormat(string[] fileNames)
{
string[] fileNamesWithImageFormat() {
string[] ret;
ret.length = imageFormats.length * fileNames.length;
for (int j = 0; j < fileNames.length) {
for (int i = 0; i < imageFormats.length; ++i) {
ret[j * fileNames.length + i] = fileNames[j] ~ "." ~ imageFormats[i];
}
}
return ret;
}
}
Сбой с сообщением об ошибке:
Error: arithmetic/string type expected for value-parameter, not string[]
Мне нужно, чтобы это, наконец, подали в import()
, Как можно устранить ошибку?
2 ответа
Вы немного усложняете это.
CTFE (выполнение функции времени компиляции) должно подходить здесь. Вы можете просто написать обычную функцию, которая обрабатывает string[]
введите и используйте его в выражениях времени компиляции. Есть некоторые ограничения, но ваш код достаточно готов к CTFE, поэтому шаблоны не нужны.
У вас также есть небольшая ошибка в ваших индексах. Исправленная версия, которая работает во время компиляции:
import std.algorithm, std.array, std.range;
import std.stdio;
string[] modify(string[] names)
{
if (!__ctfe)
assert(false);
immutable string[] imageFormats = ["bmp", "jpg", "gif", "png"];
string[] ret;
ret.length = imageFormats.length * names.length;
for (int j = 0; j < names.length; ++j) {
for (int i = 0; i < imageFormats.length; ++i) {
ret[j * imageFormats.length + i] = names[j] ~ "." ~ imageFormats[i];
}
}
return ret;
}
enum string[] input = ["one", "two"];
pragma(msg, modify(input));
void main() {}
Или проверьте это на DPaste: http://dpaste.1azy.net/7b42daf6
Если что-то неясно в предоставленном коде или вы настаиваете на использовании другого подхода - оставьте комментарий здесь. D имеет множество различных инструментов для задач компиляции.
После дальнейших поисков он обнаружился http://forum.dlang.org/post/jezkyrguyoshofciuxjq@forum.dlang.org. Это ошибка с DMD 2.061, обходной путь должен объявить fileNames как alias
,