Как мне сгенерировать массив в D? - PullRequest
5 голосов
/ 12 сентября 2011

У меня есть код C ++ 11:

auto gen = []() -> double { /* do stuff */ };
std::generate(myArray.begin(), myArray.end(), gen);

Как бы я поступил так же с массивом D? std.algorithm.fill не принимает объект функции, и я не знаю, как передать функцию в recurrence.

Ответы [ 2 ]

5 голосов
/ 12 сентября 2011

Вот версия, которая работает:

import std.algorithm, std.array, std.range, std.stdio;

void main() {
  writefln("%s", __VERSION__);
  int i;
  auto dg = delegate float(int) { return i++; };
  float[] res = array(map!dg(iota(0, 10)));
  float[] res2 = new float[10];
  fill(res2, map!dg(iota(0, res2.length)));
  writefln("meep");
  writefln("%s", res);
  writefln("%s", res2);
}

[править] Добавлена ​​версия на основе заливки (res2).

Я проверил его в Ideone (http://www.ideone.com/DFK5A), но он зависает .. друг с текущей версией DMD говорит, что он работает, хотя, так что я предполагаю, что DMD Ideone просто устарела примерно на десять до двадцати версий.

0 голосов
/ 12 сентября 2011

Вы могли бы сделать что-то вроде

auto arr = {/* generate an array and return that array */}();

Если он назначен глобальному, он должен оцениваться во время компиляции.

Вы также можете использовать строковые миксины для генерации кода для литерала массива.

...