<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Zuse Cheng Code Blog</title>
	<atom:link href="http://zusecheng.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://zusecheng.wordpress.com</link>
	<description>Just another codeblog</description>
	<lastBuildDate>Thu, 21 Feb 2008 06:14:59 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>zh-tw</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='zusecheng.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/14ffcc871ec6cc17474e04187ef8cc47?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Zuse Cheng Code Blog</title>
		<link>http://zusecheng.wordpress.com</link>
	</image>
			<item>
		<title>再談 C++/CLI: Template Metaprogramming</title>
		<link>http://zusecheng.wordpress.com/2007/12/06/%e5%86%8d%e8%ab%87-ccli-template-metaprogramming/</link>
		<comments>http://zusecheng.wordpress.com/2007/12/06/%e5%86%8d%e8%ab%87-ccli-template-metaprogramming/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 02:04:21 +0000</pubDate>
		<dc:creator>zusecheng</dc:creator>
				<category><![CDATA[C++/CLI]]></category>
		<category><![CDATA[Programming Language]]></category>

		<guid isPermaLink="false">http://zusecheng.wordpress.com/2007/12/06/%e5%86%8d%e8%ab%87-ccli-template-metaprogramming/</guid>
		<description><![CDATA[Template metaprogramming 是 Metaprogramming 的技巧之一, 也是 Modern C++ 中重要的元素
基本上 Template metaprogramming 是利用 compiler 來產生程式碼(不是目的碼喔)的一個方法
至於要產生程式碼, 就有一個問題要考慮, 就是他的能力有多強
然而 Template metaprogramming 已經被證明是 Turing-complete 
也就是他能表達所有程式語言能表達的程式(嚴格的說是演算法)
舉一個例子來說 基本上大家舉例都舉 factorial 
我在這邊示範一下費伯納西數 費伯納西數得一個簡單的解法是使用遞迴
然而費伯納西數可不是一個 Divide &#38; Conquer 的函式 (反而是 Divide &#38; Complex)
所以不適合用遞迴 我們可以利用 Template metaprogramming  把計算費伯納西數的工作交給編譯器
這樣在執行時間 就不會花任何時間和記憶體(遞迴需要占用Stack Frame)來計算了
基本上 Template metaprogramming 用到了template 中有 template 的技巧
如此一來編譯器會把他遞迴展開 然後再利用特化來製造終止條件
看以下的程式碼
#include &#60;iostream&#62;    

using namespace std;    

template [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=zusecheng.wordpress.com&blog=2211743&post=19&subd=zusecheng&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a> 是 <a target="_blank" href="http://en.wikipedia.org/wiki/Metaprogramming">Metaprogramming</a> 的技巧之一, 也是 Modern C++ 中重要的元素<br />
基本上 <a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a> 是利用 <a href="http://en.wikipedia.org/wiki/Compiler">compiler</a> 來產生程式碼(不是目的碼喔)的一個方法<br />
至於要產生程式碼, 就有一個問題要考慮, 就是他的能力有多強<br />
然而 <a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a> 已經被證明是 <a href="http://en.wikipedia.org/wiki/Turing-complete">Turing-complete</a> <br />
也就是他能表達所有程式語言能表達的程式(嚴格的說是演算法)</p>
<p>舉一個例子來說 基本上大家舉例都舉 factorial <br />
我在這邊示範一下費伯納西數 費伯納西數得一個簡單的解法是使用遞迴<br />
然而費伯納西數可不是一個 Divide &amp; Conquer 的函式 (反而是 Divide &amp; Complex)<br />
所以不適合用遞迴 我們可以利用 <a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a>  把計算費伯納西數的工作交給編譯器<br />
這樣在執行時間 就不會花任何時間和記憶體(遞迴需要占用Stack Frame)來計算了</p>
<p>基本上 <a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a> 用到了template 中有 template 的技巧<br />
如此一來編譯器會把他遞迴展開 然後再利用特化來製造終止條件<br />
看以下的程式碼</p>
<pre>#include &lt;iostream&gt;    

<span style="color:#0000ff;">using</span> <span style="color:#0000ff;">namespace</span> std;    

<span style="color:#0000ff;">template</span> &lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> n&gt;
<span style="color:#0000ff;">struct</span> Fibonacci {
  <span style="color:#0000ff;">enum</span> { value = Fibonacci &lt;n-1&gt;::value + Fibonacci &lt;n-2&gt;::value };
};    

<span style="color:#0000ff;">template</span>&lt;&gt;
<span style="color:#0000ff;">struct</span> Fibonacci &lt;0&gt; {
  <span style="color:#0000ff;">enum</span> { value = 0 };
};    

<span style="color:#0000ff;">template</span>&lt;&gt;
<span style="color:#0000ff;">struct</span> Fibonacci &lt;1&gt; {
  <span style="color:#0000ff;">enum</span> { value = 1 };
};    

<span style="color:#0000ff;">int</span> main() {
  cout &lt;&lt; Fibonacci&lt;5&gt;::value &lt;&lt; endl;
}</pre>
<p>看到這個程式 如果沒有覺得渾身不對勁 覺得這是邪魔歪道的 而且還覺得超炫<br />
恭喜你 你可以繼續看下去了 <a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a> 將會成為你讓人驚艷的技巧<br />
這邊有一個地方要說明的 就是 enum hack<br />
這是一個製造class 中 static const int 變數的方法<br />
當然上述寫 static const int 也是可以行得通的<br />
只是 大家比較習慣使用 enum hack<br />
Fibonacci&lt;15&gt;::value 會在編譯時期就 計算好數值 610</p>
<p>C#, VB 在2.0 之後 也支持泛型了 那能不能使用 <a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a> ?<br />
基本上是不行的 .NET 的泛型 既不是在Compiler Time展開<br />
也不能接受 non-type template parameter 更不用說有特化的能力<br />
也基本上只有 C++/CLI 能使用 template 來達成這個技巧<br />
然而 managed class 內不能接受 enum hack 的語法 所以要使用 static const int 來完成</p>
<p>下面來看Peter Simons用 <a href="http://en.wikipedia.org/wiki/Template_metaprogramming">Template metaprogramming</a> 用來解質數的例子  請參考 <a href="http://cryp.to/prime-sieve.html">prime-sieve.cc</a></p>
<pre><span style="color:#008000;">/*
* prime-sieve.cc -- written by Peter Simons &lt;simons@cryp.to&gt;
*
* This is an example of C++ template meta-programming. The interesting
* part is the primeSieve&lt;&gt; meta template, which will generate a list
* of integers in the range [2..n] using the Sieve of Erathostenes.
*/</span>    

<span style="color:#008000;">//////////////////////////////////////////////////</span>
<span style="color:#008000;">// Meta-programming Infrastructure</span>
<span style="color:#008000;">//////////////////////////////////////////////////</span>    

<span style="color:#0000ff;">struct</span> NullType { };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">typename</span> Head, <span style="color:#0000ff;">typename</span> Tail&gt;
<span style="color:#0000ff;">struct</span> Typelist
    {
    };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> Val&gt;
<span style="color:#0000ff;">struct</span> IntType
    {
    <span style="color:#0000ff;">enum</span> { value = Val };
    };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">bool</span> flag, <span style="color:#0000ff;">typename</span> T, <span style="color:#0000ff;">typename</span> U&gt;
<span style="color:#0000ff;">struct</span> Select
    {
    <span style="color:#0000ff;">typedef</span> T Result;
    };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">typename</span> T, <span style="color:#0000ff;">typename</span> U&gt;
<span style="color:#0000ff;">struct</span> Select&lt;<span style="color:#0000ff;">false</span>, T, U&gt;
    {
    <span style="color:#0000ff;">typedef</span> U Result;
    };    

<span style="color:#008000;">//////////////////////////////////////////////////</span>
<span style="color:#008000;">// Alorithm to create [i..n]</span>
<span style="color:#008000;">//////////////////////////////////////////////////</span>    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> i, <span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> n&gt;
<span style="color:#0000ff;">struct</span> makeIntList
    {
    <span style="color:#0000ff;">typedef</span> Typelist&lt; IntType&lt;i&gt;, <span style="color:#0000ff;">typename</span> makeIntList&lt;i+1, n&gt;::Result &gt; Result;
    };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> n&gt;
<span style="color:#0000ff;">struct</span> makeIntList&lt;n, n&gt;
    {
    <span style="color:#0000ff;">typedef</span> Typelist&lt; IntType&lt;n&gt;, NullType &gt; Result;
    };    

<span style="color:#008000;">//////////////////////////////////////////////////</span>
<span style="color:#008000;">// The Sieve of Erathostenes</span>
<span style="color:#008000;">//////////////////////////////////////////////////</span>    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> i, <span style="color:#0000ff;">typename</span> TList&gt;
<span style="color:#0000ff;">struct</span> sieveOne;    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> i, <span style="color:#0000ff;">typename</span> x, <span style="color:#0000ff;">typename</span> xs&gt;
<span style="color:#0000ff;">struct</span> sieveOne&lt; i, Typelist&lt;x,xs&gt; &gt;
    {
    <span style="color:#0000ff;">typedef</span> <span style="color:#0000ff;">typename</span> Select&lt;
        x::value % i != 0,
        Typelist&lt; x, <span style="color:#0000ff;">typename</span> sieveOne&lt;i, xs&gt;::Result &gt;,
        <span style="color:#0000ff;">typename</span> sieveOne&lt;i, xs&gt;::Result
                           &gt;::Result    Result;
    };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> i&gt;
<span style="color:#0000ff;">struct</span> sieveOne&lt;i, NullType&gt;
    {
    <span style="color:#0000ff;">typedef</span> NullType Result;
    };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">typename</span> TList&gt;
<span style="color:#0000ff;">struct</span> sieveAll;    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">typename</span> x, <span style="color:#0000ff;">typename</span> xs&gt;
<span style="color:#0000ff;">struct</span> sieveAll&lt; Typelist&lt;x,xs&gt; &gt;
    {
    <span style="color:#0000ff;">typedef</span> Typelist&lt;
        x,
        <span style="color:#0000ff;">typename</span> sieveAll&lt;<span style="color:#0000ff;">typename</span> sieveOne&lt;x::value, xs&gt;::Result&gt;::Result
                    &gt;     Result;
    };    

<span style="color:#0000ff;">template</span>&lt;&gt;
<span style="color:#0000ff;">struct</span> sieveAll&lt;NullType&gt;
    {
    <span style="color:#0000ff;">typedef</span> NullType Result;
    };    

<span style="color:#0000ff;">template</span>&lt;<span style="color:#0000ff;">unsigned</span> <span style="color:#0000ff;">int</span> n&gt;
<span style="color:#0000ff;">struct</span> primeSieve
    {
    <span style="color:#0000ff;">typedef</span> <span style="color:#0000ff;">typename</span> sieveAll&lt;<span style="color:#0000ff;">typename</span> makeIntList&lt;2,n&gt;::Result&gt;::Result Result;
    };    

<span style="color:#008000;">// 省略把 Algorithm 包裝成 Interator 的部分 ...</span>    

<span style="color:#008000;">// TEST</span>    

#include &lt;iostream&gt;
#include &lt;iterator&gt;
<span style="color:#0000ff;">using</span> <span style="color:#0000ff;">namespace</span> std;    

<span style="color:#0000ff;">int</span> main(<span style="color:#0000ff;">int</span>, <span style="color:#0000ff;">char</span>**)
    {
    <span style="color:#0000ff;">enum</span> { n = 20 };
    cout &lt;&lt; "<span style="color:#8b0000;">Finding prime numbers in [2..</span>" &lt;&lt; n &lt;&lt; "<span style="color:#8b0000;">]:\n</span>";
    toIterator&lt;primeSieve&lt;n&gt;::Result &gt; generator;
    generator(ostream_iterator&lt;<span style="color:#0000ff;">int</span>&gt;(cout, "<span style="color:#8b0000;"> </span>"));
    cout &lt;&lt; "<span style="color:#8b0000;">\n</span>";    

    <span style="color:#0000ff;">return</span> 0;
    }    

<span style="color:#008000;">// Result</span>    

Finding prime numbers in [2..20]:    

2 3 5 7 11 13 17 19</pre>
<p>簡潔有力 效率高</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/zusecheng.wordpress.com/19/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/zusecheng.wordpress.com/19/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/zusecheng.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/zusecheng.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/zusecheng.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/zusecheng.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/zusecheng.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/zusecheng.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/zusecheng.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/zusecheng.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/zusecheng.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/zusecheng.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=zusecheng.wordpress.com&blog=2211743&post=19&subd=zusecheng&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://zusecheng.wordpress.com/2007/12/06/%e5%86%8d%e8%ab%87-ccli-template-metaprogramming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ce73462f4e541514e58ade36b7f4a59e?s=96&#38;d=identicon" medium="image">
			<media:title type="html">zusecheng</media:title>
		</media:content>
	</item>
		<item>
		<title>STL/CLR: 2008 C++/CLI的利器</title>
		<link>http://zusecheng.wordpress.com/2007/12/03/stlclr-2008-ccli%e7%9a%84%e5%88%a9%e5%99%a8/</link>
		<comments>http://zusecheng.wordpress.com/2007/12/03/stlclr-2008-ccli%e7%9a%84%e5%88%a9%e5%99%a8/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 08:22:46 +0000</pubDate>
		<dc:creator>zusecheng</dc:creator>
				<category><![CDATA[C++/CLI]]></category>
		<category><![CDATA[Programming Language]]></category>

		<guid isPermaLink="false">http://zusecheng.wordpress.com/2007/12/03/stlclr-2008-ccli%e7%9a%84%e5%88%a9%e5%99%a8/</guid>
		<description><![CDATA[C++/CLI 雖然算是ISO C++ 相容的一個語言
但是就EC++說的一樣 C++ 是一個語言聯邦
在STL中運作是需要共識的 也因為這樣 Managed Type 在  STL 沒有辦法 很正常的使用
VS2008中 C++/CLI 中加入了一個大利器 STL/CLR 這是一個 STL在CLR中的實作版本
他將所有的元件放在 命名空間 cliext 內 如 cliext :: vector
組件檔是 Microsoft.VisualC.STLCLR.dll
當然最重要的是 cliext 內的容器是可以容納 Managed Type 的
為了能讓原始碼可以誇越STL和cliext
我們可以使用下面的巨集
#define _STL_OR_CLIEXT std 或 #define _STL_OR_CLIEXT cliext
接下來使用 _STL_OR_CLIEXT::vector 就可以更改 _STL_OR_CLIEXT 的 來切換兩者 了
範例如下
#ifdef _M_CEE
#include &#60;cliext\vector&#62;
#define _STD_OR_CLIEXT cliext
#else
#include &#60;vector&#62;
#define _STD_OR_CLIEXT std
#endif
如同STL, 在cliext的容器 中運作是也是需要共識的
以下為想在cliext中運作的 Type (當然包含Managed Type [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=zusecheng.wordpress.com&blog=2211743&post=17&subd=zusecheng&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>C++/CLI 雖然算是ISO C++ 相容的一個語言<br />
但是就EC++說的一樣 C++ 是一個語言聯邦<br />
在STL中運作是需要共識的 也因為這樣 Managed Type 在  STL 沒有辦法 很正常的使用</p>
<p>VS2008中 C++/CLI 中加入了一個大利器 STL/CLR 這是一個 STL在CLR中的實作版本<br />
他將所有的元件放在 命名空間 <strong>cliext </strong>內 如 <strong>cliext :: vector</strong><strong><br />
</strong>組件檔是 <strong>Microsoft.VisualC.STLCLR.dll<br />
</strong>當然<strong>最重要的是 cliext </strong>內的容器是可以容納 Managed Type 的</p>
<p>為了能讓原始碼可以誇越STL和cliext<br />
我們可以使用下面的巨集<br />
#define _STL_OR_CLIEXT std 或 #define _STL_OR_CLIEXT cliext<br />
接下來使用 <strong>_STL_OR_CLIEXT::vector</strong> 就可以更改 _STL_OR_CLIEXT 的 來切換兩者 了<br />
範例如下</p>
<p>#ifdef _M_CEE<br />
#include &lt;cliext\vector&gt;<br />
#define _STD_OR_CLIEXT cliext<br />
#else<br />
#include &lt;vector&gt;<br />
#define _STD_OR_CLIEXT std<br />
#endif</p>
<p>如同STL, 在cliext的容器 中運作是也是需要共識的<br />
以下為想在cliext中運作的 Type (當然包含Managed Type ) 需要的共識</p>
<li>A public copy constructor.</li>
<li>A public assignment operator.</li>
<li>A public destructor.這東西最重要的功能除了正常的STL功能外<br />
最重要的當然是和別的容器互相利用囉 (如果沒有 大家也不會用他吧)<br />
需要互相利用的容器分成兩大類 一個是.NET Collection 一個是 STL Container</p>
<p>先談和 .NET Collection 的部分 : 這部分問題比較小<strong> cliext</strong> 有可以接受.NET Collection 的建構函式 可以使用<br />
或是利用<strong>cliext::collection_adapter </strong>來進行轉換<br />
逆向操作則是使用 <strong>cliext::make_collection<br />
</strong><br />
STL的部分 要使用VC2008的新功能 <strong><a href="http://msdn2.microsoft.com/en-us/library/bb384865(VS.90).aspx">msclr::interop::marshal_as</a></strong><br />
支援的型態如下表</p>
<table border="0" width="400" cellPadding="2" cellSpacing="0">
<tr>
<td width="100" vAlign="top"><b>From Type</b></td>
<td width="100" vAlign="top"><strong>To Type</strong></td>
<td width="100" vAlign="top"><b>Marshal method</b></td>
<td width="100" vAlign="top"><strong>Include file</strong></td>
</tr>
<tr>
<td width="100" vAlign="top">System::String^<br />
const char *<br />
char *<br />
System::String^<br />
const wchar_t *<br />
wchar_t *<br />
System::IntPtr<br />
HANDLE<br />
System::String^<br />
BSTR<br />
System::String^<br />
bstr_t<br />
System::String^<br />
std::string<br />
System::String^<br />
std::wstring<br />
System::String^<br />
CStringT&lt;char&gt;<br />
System::String^<br />
CStringT&lt;wchar_t&gt;<br />
System::String^<br />
CComBSTR</td>
<td width="100" vAlign="top">const char *<br />
System::String^<br />
System::String^<br />
const wchar_t*<br />
System::String^<br />
System::String^<br />
HANDLE<br />
System::IntPtr<br />
BSTR<br />
System::String^<br />
bstr_t<br />
System::String^<br />
std::string<br />
System::String^<br />
std::wstring<br />
System::String^<br />
CStringT&lt;char&gt;<br />
System::String^<br />
CStringT&lt;wchar_t&gt;<br />
System::String^<br />
CComBSTR<br />
System::String^</td>
<td width="100" vAlign="top">marshal_context<br />
marshal_as<br />
marshal_as<br />
marshal_context<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_context<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as<br />
marshal_as</td>
<td width="100" vAlign="top">marshal.h<br />
marshal.h<br />
marshal.h<br />
marshal.h<br />
marshal.h<br />
marshal.h<br />
marshal_windows.h<br />
marshal_windows.h<br />
marshal_windows.h<br />
marshal.h<br />
marshal_windows.h<br />
marshal_windows.h<br />
marshal_cppstd.h<br />
marshal_cppstd.h<br />
marshal_cppstd.h<br />
marshal_cppstd.h<br />
marshal_atl.h<br />
marshal_atl.h<br />
marshal_atl.h<br />
marshal_atl.h<br />
marshal_atl.h<br />
marshal_atl.h</td>
</tr>
</table>
<p>以下為所有的<strong> cliext</strong> 元件列表</p>
<ul>
<li><a href="http://msdn2.microsoft.com/bb157734(VS.90).aspx">adapter (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb386172(VS.90).aspx">algorithm (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb398188(VS.90).aspx">deque (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385677(VS.90).aspx">functional (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb398039(VS.90).aspx">hash_map (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb398091(VS.90).aspx">hash_multimap (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385647(VS.90).aspx">hash_multiset (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb398130(VS.90).aspx">hash_set (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385936(VS.90).aspx">list (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385692(VS.90).aspx">map (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385271(VS.90).aspx">multimap (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb157843(VS.90).aspx">multiset (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385117(VS.90).aspx">numeric (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385337(VS.90).aspx">priority_queue (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385855(VS.90).aspx">queue (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb385157(VS.90).aspx">set (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb157681(VS.90).aspx">stack (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb386336(VS.90).aspx">utility (STL/CLR)</a></li>
<li><a href="http://msdn2.microsoft.com/bb386284(VS.90).aspx">vector (STL/CLR)</a></li>
</ul>
</li>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/zusecheng.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/zusecheng.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/zusecheng.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/zusecheng.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/zusecheng.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/zusecheng.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/zusecheng.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/zusecheng.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/zusecheng.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/zusecheng.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/zusecheng.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/zusecheng.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=zusecheng.wordpress.com&blog=2211743&post=17&subd=zusecheng&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://zusecheng.wordpress.com/2007/12/03/stlclr-2008-ccli%e7%9a%84%e5%88%a9%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ce73462f4e541514e58ade36b7f4a59e?s=96&#38;d=identicon" medium="image">
			<media:title type="html">zusecheng</media:title>
		</media:content>
	</item>
		<item>
		<title>Implementing the Singleton Pattern in C#</title>
		<link>http://zusecheng.wordpress.com/2007/11/29/implementing-the-singleton-pattern-in-c/</link>
		<comments>http://zusecheng.wordpress.com/2007/11/29/implementing-the-singleton-pattern-in-c/#comments</comments>
		<pubDate>Thu, 29 Nov 2007 05:42:55 +0000</pubDate>
		<dc:creator>zusecheng</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming Language]]></category>

		<guid isPermaLink="false">http://zusecheng.wordpress.com/2007/11/29/implementing-the-singleton-pattern-in-c/</guid>
		<description><![CDATA[基本上 Singleton Pattern 可以有很多實作方法
而 Singleton Pattern 中比較重要的考量點有兩個

Thread Safe
Lazy Binding 

在C#中,最簡單的實作方式就是


public sealed class Singleton
{
    static Singleton instance = null;
    Singleton() {}
    public static Singleton Instance
    {
        get
        {
    [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=zusecheng.wordpress.com&blog=2211743&post=15&subd=zusecheng&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>基本上 <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton Pattern</a> 可以有很多實作方法<br />
而 <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton Pattern</a> 中比較重要的考量點有兩個</p>
<ul>
<li>Thread Safe</li>
<li>Lazy Binding </li>
</ul>
<p>在C#中,最簡單的實作方式就是<br />
<code><br />
</code></p>
<pre><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">sealed</span> <span style="color:#0000ff;">class</span> Singleton
{
    <span style="color:#0000ff;">static</span> Singleton instance = <span style="color:#0000ff;">null</span>;
    Singleton() {}
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> Singleton Instance
    {
        <span style="color:#0000ff;">get</span>
        {
            <span style="color:#0000ff;">if</span> (instance==<span style="color:#0000ff;">null</span>)
            {
                instance = <span style="color:#0000ff;">new</span> Singleton();
            }
            <span style="color:#0000ff;">return</span> instance;
        }
    }
}</pre>
<p><code></code><br />
Lazy Binding -  OK!<br />
Thread safe  -   NO</p>
<h6></h6>
<p>如果為了滿足 Thread Safe</p>
<pre><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">sealed</span> <span style="color:#0000ff;">class</span> Singleton
{
    <span style="color:#0000ff;">static</span> Singleton instance=<span style="color:#0000ff;">null</span>;
    <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> <span style="color:#0000ff;">object</span> objlock = <span style="color:#0000ff;">new</span> <span style="color:#0000ff;">object</span>();
    Singleton()
    {
    }
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> Singleton Instance
    {
        <span style="color:#0000ff;">get</span>
        {
            <span style="color:#0000ff;">lock</span> (objlock)
            {
                <span style="color:#0000ff;">if</span> (instance==<span style="color:#0000ff;">null</span>)
                {
                    instance = <span style="color:#0000ff;">new</span> Singleton();
                }
                <span style="color:#0000ff;">return</span> instance;
            }
        }
    }
}</pre>
<p>Lazy Binding -  OK!<br />
Thread safe  -   OK!</p>
<p>可惜它有一個很大的缺點 lock 的時間消耗是 if的好幾個數量級<br />
接下來是使用OS中最普遍解法 double checking</p>
<pre>    <span style="color:#0000ff;">if</span> (instance==<span style="color:#0000ff;">null</span>)
    {
                <span style="color:#0000ff;">lock</span> (objlock)
                {
                    <span style="color:#0000ff;">if</span> (instance==<span style="color:#0000ff;">null</span>)
                    {
                        instance = <span style="color:#0000ff;">new</span> Singleton();
                    }
                }
    }
    <span style="color:#0000ff;">return</span> instance;</pre>
<p>當然 其實程式語言也可以很美 利用C#語言的特性</p>
<pre><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">sealed</span> <span style="color:#0000ff;">class</span> Singleton
{
    <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> Singleton instance = <span style="color:#0000ff;">new</span> Singleton();
    <span style="color:#0000ff;">static</span> Singleton(){}     Singleton(){}
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> Singleton Instance
    {
        <span style="color:#0000ff;">get</span>
        {
            <span style="color:#0000ff;">return</span> instance;
        }
    }
}</pre>
<p>又簡短又正確 可惜它失去Lazy Binding 的能力<br />
想加入Lazy Binding 需要作一些苦工</p>
<pre><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">sealed</span> <span style="color:#0000ff;">class</span> Singleton
{
    Singleton(){}
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> Singleton Instance
    {
        <span style="color:#0000ff;">get</span> {
            <span style="color:#0000ff;">return</span> SingletonPorvider.instance;
        }
    }
    <span style="color:#0000ff;">class</span> SingletonPorvider
    {
        <span style="color:#0000ff;">static</span> SingletonPorvider(){}          <span style="color:#0000ff;">internal</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> Singleton instance = <span style="color:#0000ff;">new</span> Singleton();
    }
}</pre>
<p>最後 把他泛化</p>
<p>// NON Lazy Binding 版本</p>
<pre><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> Singleton&lt;T&gt; where T : <span style="color:#0000ff;">new</span>()
{
    <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> T instance = <span style="color:#0000ff;">new</span> T();
    <span style="color:#0000ff;">static</span> Singleton(){}
    Singleton(){}
    <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> T Instance
    {
        <span style="color:#0000ff;">get</span>
        {
            <span style="color:#0000ff;">return</span> instance;
        }
    }
}</pre>
<p>// Lazy Binding 版本</p>
<pre><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> Singleton&lt;T&gt; where T : <span style="color:#0000ff;">new</span>()
{
    Singleton(){}
  <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> T Instance
  {
   <span style="color:#0000ff;">get</span>
   {
    <span style="color:#0000ff;">return</span> SingletonPorvider.instance;
   }
  }
  <span style="color:#0000ff;">class</span> SingletonPorvider
  {
   <span style="color:#0000ff;">static</span> SingletonPorvider() { }
   <span style="color:#0000ff;">internal</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">readonly</span> T instance = <span style="color:#0000ff;">new</span> T();
  }
}</pre>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/zusecheng.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/zusecheng.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/zusecheng.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/zusecheng.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/zusecheng.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/zusecheng.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/zusecheng.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/zusecheng.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/zusecheng.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/zusecheng.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/zusecheng.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/zusecheng.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=zusecheng.wordpress.com&blog=2211743&post=15&subd=zusecheng&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://zusecheng.wordpress.com/2007/11/29/implementing-the-singleton-pattern-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ce73462f4e541514e58ade36b7f4a59e?s=96&#38;d=identicon" medium="image">
			<media:title type="html">zusecheng</media:title>
		</media:content>
	</item>
	</channel>
</rss>