Соединение строк во время компиляции

Я хочу объединить имена файлов и форматы изображений во время компиляции. Следующий пример не работает, потому что 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,

Другие вопросы по тегам