4

次のようなタイプがあるとします。

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

次のようなインターフェイスを想定すると、これらのタイプのリストをどのように並べ替えますか。

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

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

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

4

3 に答える 3

3

D 1.0 を使用して、QuickSort を使用します。

http://paste.dprogramming.com/dplgp5ic

于 2009-04-21T05:56:04.753 に答える
1

ちなみに、他の理由がない限り、タプルは値でも問題なく機能するため、構造体で値をラップする必要はありません。

alias Sorted!(4, 2, 1, 3) SortedValues;
于 2009-04-21T06:02:09.090 に答える
-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..." );
于 2009-04-22T11:22:19.357 に答える