Static method for Interface in C++

在 C++ 中的 interface (這裡應該是 Abstract Class) 中,其實是沒辦法宣告一個 static 的 virtual method 的,不過應該有類似的方法可以要求繼承者一定要實作什麼樣的 static method 才對,於是從維基百科找到 CRTP(Curiously recurring template pattern) 的頁面中有類似此問題的解法

做法是將 static function 分成 parent call 跟實作的 sub function,統一從 parent's static function 呼叫。如下:

template <class T> 
struct Base
{
    static void static_func()
    {
        T::static_sub_func();
    }
};
 
struct Derived : Base<Derived>
{
    static void static_sub_func();
};

但是我覺得還是不夠直覺,因此做了一點小修改另外還參考了一下這篇《Static interfaces in C++》,大致上的程式碼如下:

template <class T>
struct Interface
{
public:
 static T testing() { return NotImplementYet(); };
private:
 struct NotImplementYet {};
};

class Impl : public Interface<Impl>
{
public:
 Impl() {}
 static Impl testing() { return Impl(); };
};

void test()
{
 Impl::testing();
}

如此一來,除了 Interface 部分可以看到真正的 static method 宣告,也可以在編譯時期檢查是不是 Child 沒有實作(如果沒有實作就會繼承上面的 method,得到 could not convert Error,也可以從 Error message 看到 NotImplementYet 字眼)。

雖然不是什麼小技巧,也說不上是什麼很好的辦法,但是足夠讓我在寫的時候發現哪裏還沒實作;而且不管是上面哪種方法都要程式碼中有呼叫到,Compiler 才會去檢查(可能 static method 能不產生 code 就不會產生吧(ry )。

誰叫 C++ 只有 ABC 沒有 Interface 呢XDDDDD 只好將就點囉

因主題更新,留言功能暫時停用中。