D Шаблоны: сортировка списка типов - PullRequest
4 голосов
/ 21 апреля 2009

Предположим, у вас есть тип, подобный следующему:

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

Как бы вы отсортировали список этих типов, предполагая, что интерфейс выглядит примерно так:

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

Вы можете использовать функции D 2.x, если это поможет найти лучшее решение, но, пожалуйста, укажите, если вы это сделаете.

Я опубликую свое решение через день или около того. :)

Ответы [ 3 ]

3 голосов
/ 21 апреля 2009

Используя D 1.0, используйте QuickSort!

http://paste.dprogramming.com/dplgp5ic

1 голос
/ 21 апреля 2009

Кстати, если у вас нет других причин для этого, нет необходимости заключать значение в структуры, так как кортежи прекрасно работают и со значениями.

alias Sorted!(4, 2, 1, 3) SortedValues;
0 голосов
/ 22 апреля 2009

Вот мое решение. Заметьте, что это так же круто, как у 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..." );
...