d转换元组为数组

假定,std.typecons.Tuple,可用[tup.expand]从元组造数组.[valSeq]搞值序列.
如下搞数组的数组:

auto arrayOfArrays = [ keys, values ];

更通用的:

import std;
//编译慢但是很方便
auto makeTestTuple(int i) {
  return tuple!("key", "value")((i * 2).to!string,(double(i) / 10).to!string);
}

void main() {
  auto tuples = iota(10)
                .map!makeTestTuple
                .array;

  string[] keys;
  string[] values;

  writeln("命令式:");

  foreach (t; tuples) {
    keys ~= t.key;
    values ~= t.value;
  }

  writeln(keys);
  writeln(values);

  writeln("替代方案:");
  keys = tuples.map!(t => t.key).array;
  values = tuples.map!(t => t.value).array;
  writeln(keys);
  writeln(values);

  writeln("更通用:");
  keys = tuples.memberArray!"key";
  values = tuples.memberArray!"value";
  writeln(keys);
  writeln(values);
}

auto memberArray(string member, T)(T[] tuples) {
  return tuples.map!(t => mixin("t." ~ member)).array;
}

第2个程序:

import std;

auto makeTestTuple(int i) {
  return tuple!("key", "value", "其他")(
    (i * 2).to!string,
    (double(i) / 10).to!string,
    i * i);
}

mixin template matchingMember(string name, T) {
  mixin (T.stringof ~ "[] " ~ name ~ ';');
}

template TupleMemberArrays(T) {
  alias types = T.Types;
  alias fieldNames = T.fieldNames;
  enum memberCount = types.length;

  struct TupleMemberArrays {
    static foreach (i; 0 .. memberCount) {
      mixin matchingMember!(fieldNames[i], types[i]);
    }

    this(T[] tuples) {
      foreach (t; tuples) {
        static foreach (i; 0 .. memberCount) {
          mixin (format!q{
              %s ~= t.%s = t[%s];
            }(fieldNames[i], fieldNames[i], i));
        }
      }
    }
  }
}

void main() {
  auto tuples = iota(10)
                .map!makeTestTuple
                .array;

  alias S = TupleMemberArrays!(ElementType!(typeof(tuples)));
  auto s = S(tuples);
  writeln(s.key);
  writeln(s.value);
  writeln(s.其他);
}

第二个程序定义了匹配元组成员的类型.给定成员名为"key","value""其他"的元组;及串,串,整类型;生成类似以下结构:

struct YourAliasHere {
  string[] key;
  string[] value;
  int[] 其他;
}

限制:该实现使用并非所有元组都使用的字段名.但在需要时,可更改为生成field0,field1等.

posted @   zjh6  阅读(17)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示