2017年12月26日 星期二

靜態多型

相對於靜態多型就是一般較多使用的的動態多型,如:
class Base
{
public:
  virtual void f() = 0;
};
class Derived :public Base
{
  virtual void f() override
  {
  }
public:
};
若改為靜態多型可能會像以下這樣:
template<typename DERIVED>
class Base
{
public:
  void f()
  {
    static_cast<DERIVED*>(this)->f_Imp();
  }
};
class Derived :public Base<Derived>
{
  void f_Imp()
  {
  }
public:
  friend class Base<Derived>;
};

2017年12月25日 星期一

[分享]template 參數的 class 和 typename 還是有差別

若是要做 class 用,就明確指名 class 吧

// template<typename H> 這在 vs2015 過不了
template<class H>
class A
{
  void f()
  {
    cout << "OK" << endl;
  }
public:
  friend H;
};
class B
{
public:
  void f()
  {
    On_a.f();
  }
  A<B> On_a;
};

2017年12月23日 星期六

[轉貼]強制實作

此文截取自 http://www.programmer-club.com.tw/ShowSameTitleN/c/46861.html

用一個範例做個總結,也感謝 coco 提供的 assert,在 C++ 沒有提供 must 繼承實作之下,還能做到類似的效果,讓程式簡潔不少。但問題由原本的強制繼承實作,變成須強制 assert 實作,更不好達成,由此看出 must 繼承實作的須要性

範例主要展示 prototype pattern 及 visitor pattern 的架構,不過 visitor pattern 做了改良,可以
採用 ClassID 做配對,可以在執行時期做較機動的處理,但為了減少篇幅和難度,還是寫死未做較機動的
處理

Class C 是為了表現未強制實作的後果,有幾處做了 remark,把 remark 的地方恢復,就可正常執行

2017年12月9日 星期六

CMRegSelf 插件註冊輔助

這是一個輔助性的插件,幫忙減輕 cxxlObjectPlugin 插件註冊的繁雜規劃,也減輕應用程式註冊插件的負擔。為此,CxxlMan2 的標準插件 CxxlMan2Plugin 全部修改成全面支援 CMRegSelf。

CMRegSelf 的機制在於讓 CxxlMan2Plugin 插件檔(dll 檔)有自我註冊插件的能力,並提供主程式註冊這些插件檔的功能。同時也提供一個範例,以期能完全瞭解這些運作。

注意!由於不同系列編譯器編碼的差異(比如 vc 與 gcc),不要把它們放置在一起或同一個插件搜尋路徑中,否則註冊處理時會有當掉的危險。所以內定的 CxxlMan2Plugin 資料夾也要有分別,比如分成 C:\CxxlMan2Plugin_vc 和 C:\CxxlMan2Plugin_gcc

下載點:
CMRegSelf_Src_20221110.zip