2009-04-21 81 views
4

列表假設你有一個類型如下所示:d模板:那種類型

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

你會如何排序這些類型的列表,假定一個接口是這樣的:

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

如果您想要更好的解決方案,您可以使用D 2.x功能,但請註明您是否這樣做。

我會在一天左右發佈我的解決方案。 :)

回答

1

通過,除非你有其他的原因這樣做沒有必要來包裝結構的值作爲元組的工作只是罰款與價值觀以及方式。

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

正確;但我相信元組會打破別名。使用包裝器結構只是我能想到的更一般的問題形式。 :) – 2009-04-21 06:11:19

-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...");