2

在玩 D 的 mixin 时,我遇到了这个难题。

////////////////////////////////////////////////////////
//      Proxy
////////////////////////////////////////////////////////


//What I'm aiming for
/*
struct Proxy4(T) if (isNumeric!T)
{
    T* x;
    T* y;
    T* z;
    T* w;
}
*/
//Preferred implementation
struct Proxy(T, uint n) if (2<=n && n<=4 &&
                                     isNumeric!T)
{
    //Declare pointer fields
    mixin(iota(n).map!(i => ("T* "~"xyzw"[i]~";")).join());
}

这无法编译,因为

函数字面量不能是类成员

希望对于外面的人来说,这很容易解决。

注意:我尝试过使用 writeln() 进行调试。

writeln(iota(4).map!(i => ("T* "~"xyzw"[i]~";")).join());

上面的代码打印:T* x;T* y;T* z;T* w;

编辑:我自己的答案不如彼得亚历山大的答案,所以我把它编辑了。

4

1 回答 1

2

实际上,问题似乎是/中的mixin表达式中存在 lambda 函数。classstruct

这有效:

mixin( iota(n).map!(q{"T " ~ "xyzw"[a] ~ ";"}).join() );

您的原始表达式在类之外也可以正常工作(例如,在内部声明局部变量main())。尝试在编译时运行代码没有问题,这只是一个奇怪的 DMD 前端实现限制。

已经为此问题提交了一个错误。

于 2013-08-03T10:22:15.373 回答