謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

個人的タプルのまとめ

  • 式/型タプルのforeachはコンパイル時に評価される。ただし、関数の中でないと使えない(多分バグ)。
  • 式タプルはようは変数のタプルである。ただし、別のテンプレートに渡すとスライスが出来ない(多分バグ)。

って事でこんなコードも通る。(prefixを複数にしたいならprefixをchar[ ][ ]にすればいいけど、static foreachが無いからその先がどうしようも無い。char[ ]以外にも出来るようにしたいけどネストテンプレートで色々バグがあるので出来ない。)

private import std.typetuple,std.stdio;

interface Base{
  char[] getPrefix();
}

class Foo:Base{
  const char[] prefix = "foo";
  char[] getPrefix(){
    return prefix;
  }
}

class Bar:Base{
  const char[] prefix = "bar";
  char[] getPrefix(){
    return prefix;
  }
}

Base getClass(T...)(char[] prefix){
  switch (prefix){
    foreach (U; T){
      case U.prefix:
        return new U;
    }
    default:
  }
  return null;
}

void main(char[][] args){
  if(args.length < 2)return 1;
  Base a = getClass!(Foo,Bar)(args[1]);
  if(!a)return 1;
  writefln(a.getPrefix);
}

こんなコードも通る。(この例はpiano曲線さんのをベース)

import std.typetuple,std.stdio;
template CopyTuple(Values...) {
  void to(Types...)(inout Types lhs){
//    lhs[0..$] = Values[0..$];//lvalueに出来ない
    foreach(i, V;Values){
//      lhs[i] = V;//文字列が壊れる
      lhs[i] = Values[i];
    }
  }
}

こんなコードも通る。

import std.stdio;
void main(){
  int a=0,b=5,c=1;
  alias Test2!(a,b,c) tup;
  writefln(tup);
}

まだバグだらけだわな。色々遊ぼうとしたけど結構無理だった。