2009-04-21 6 views
4

のリストをソート次のようなタイプがあるとします。Dテンプレート:タイプ

alias Sorted!(Value!(4), Value!(2), Value!(1), Value!(3)) SortedValues; 

struct Value(int v_) 
{ 
    static const v = v_: 
} 

どのようにこのようなインターフェイスのものを想定し、これらのタイプのリストをソートします

D 2.xの機能は、より良い解決策が得られる場合は使用することができますが、そうした場合は記載してください。

私は1日ほどで解決策を投稿します。 :)

答えて

1

あなたがそれを行うには他の理由がない限りタプルは、同様の値でうまく動作するよう構造体に値をラップする必要はありません。

alias Sorted!(4, 2, 1, 3) SortedValues; 
+0

True;しかし、私はタプルが別名で壊れていると信じています。ラッパー構造体の使用は、私が考えることができるより一般的な形式のものでした。 :) –

-1

私の解決策です。 FeepingCreatureと同じくらいクールだが、分かりやすいだろう。最初の型を(ソート後に)リストの残りの部分に再帰的に挿入することによって動作します。

module sort; 

/* 
* Tango users substitute "tango.core.Tuple" for "std.typetuple" and "Tuple" 
* for "TypeTuple". 
*/ 

import std.typetuple; 

struct Val(string v_) 
{ 
    static const v = v_; 
} 

template Sorted_impl(T) 
{ 
    alias TypeTuple!(T) Sorted_impl; 
} 

template Sorted_impl(T, U, V...){ 

    static if(T.v < U.v) 
     alias TypeTuple!(T, U, V) Sorted_impl; 

    else 
     alias TypeTuple!(U, Sorted_impl!(T, V)) Sorted_impl; 
} 

template Sorted(T) 
{ 
    alias TypeTuple!(T) Sorted; 
} 

template Sorted(T, U...) 
{ 
    alias Sorted_impl!(T, Sorted_impl!(U)) Sorted; 
} 

pragma(msg, Sorted!(Val!("a")).stringof); 

pragma(msg, Sorted!(Val!("b"), Val!("a")).stringof); 

pragma(msg, Sorted!(
    Val!("d"), Val!("a"), Val!("b"), Val!("c") 
).stringof); 

static assert(false, "nothing to compile here, move along..."); 
関連する問題