Monday, March 03, 2014

Policy-Based Class Design, Ch 1, Modern C++ Design

這章介紹的重點,是使用 template 參數作為 class 的行為或者結構,使得 library class 的界面可以清楚分割,並且增進執行效率。原本的範例是 smart pointer,但是其實這邊的觀念和使用 virtual function 很像。比如一組 file I/O 的 library,要設計成可以操作 local file, stdin, stdout,也可以操作網路上的檔案,會把 bool write(...) 設計成這樣:

template<class F>
class Backup : public F
{
    bool write(void* pData, size_t n)
    {
        return F().write(pData, n);
    }
};

struct LocalFile
{
    bool write(pData, n){ return fwrite(pData, 1, n, pFile);
};

struct RemoteFile
{
    ...
};

使用的時候,可以選擇不同形式的 policy 宣告。

typedef Backup<LocalFile> LocalBackup;
LocalBackup backup;
backup.write(...); 

也可以在 library 外面自訂 policy,產生新的組合:
Backup<SocialNetworkProfile> facebookBackup;

實作的困難點在於分割出要執行的 policy,還有制定 policy 的行為。上面的例子裡,template<class F> class Backup : public F 的繼承關係,可以讓 Backup 繼承 F 提供的功能,增加使用的彈性。

No comments: