あなたがやっていることはやや奇妙なことですが、確かに可能です。最もナイーブ、インプレースの方法は、おそらく次のようになります。
void update(T)(ref T t)
if(is(T == struct))
{
foreach(ref var; t.tupleof)
++var;
}
おそらくそれをコピーし、更新された値を持つ新しいものを構築しようとするよりも、それをむしろ更新するだろう(コピーでそれを行うための最も簡単な方法私はあなたが本当にしたい場合には)あまりにも行うことができることを確信しているものの:
T update(T)(T t)
if(is(T == struct))
{
auto copy = t;
foreach(ref var; copy.tupleof)
++var;
return copy;
}
ここでの主な問題は、当然のことながら、これらの両方のテンプレート制約があまりにも弱いということです。あなたがしなければならないのは、あなたの構造体にunincrementable型があり、それは動作しません。それはおそらくあなたのためにそれをテストするための名を冠したテンプレートを作成することです解決するための最も簡単な方法:
T update(T)(T t)
if(isIncrementableStruct!T)
{
auto copy = t;
foreach(ref var; copy.tupleof)
++var;
return copy;
}
template isIncrementableStruct(T)
{
enum isIncrementableStruct = is(T == struct) &&
is(typeof({T t; foreach(var; t.tupleof) ++var;}));
}
をそして、あなたがincrementableあるすべてのフィールドをインクリメントし、一人で他の人を残すことができるようにしたい場合は、あなたおそらくような何かD」:要素があること、それらのコピーを持つのではなく、更新されたようにref
を使用して直接ながら、いずれの場合においても
T update(T)(T t)
if(is(T == struct))
{
auto copy = t;
foreach(ref var; copy.tupleof)
{
static if(canIncrement!(typeof(var)))
++var;
}
return copy;
}
template canIncrement(T)
{
enum canIncrement = is(typeof({T var; ++var;}));
}
を、あなたが表示される主なものを見逃しているとはtupleof
上で反復処理を試みることでした更新しました。
すばらしいウィザードリです! – YGL