1

コンパイル時にファイル名と画像形式を結合したい。次の例は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()。エラーはどのように解決できますか?

4

2 に答える 2

5

あなたはこれを少し複雑にしています。

CTFE (Compile-Time Function Execution) はここに適しているはずです。入力を処理する通常の関数を記述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 には、コンパイル時のタスク用のさまざまなツールがたくさんあります。

于 2013-03-01T15:53:57.977 に答える
0

さらに検索すると、http://forum.dlang.org/post/jezkyrguyoshofciuxjq@forum.dlang.orgが見つかりました。これは DMD 2.061 のバグです。回避策は、fileNames を として宣言することaliasです。

于 2013-03-01T12:09:06.500 に答える