2023年4月4日 星期二

C++:簡介 CRTP 與 Mixin Classes

本文為 C++ Software Design 書的第 27 節內容。

Mixin classes 的目的是讓一個類別能注入我們想要的操作,通常利用 CRTP 來實作。比如說若想要讓一個類別能相加,則實作 Addable 類別:
struct Addable
{
  friend Derived& operator+=(Derived& lhs, Derived const& rhs) {
    lhs.get() += rhs.get();
    return lhs;
  }
  friend Derive operator+(Derived const& lhs, Derived const& rhs) {
    return Derived{lhs.get() + rhs.get()};
  }
};

template<typename T, typename Tag>
struct StrongType : private Addable<StrongType<T, Tag>>
{};
而當需要多個 mixin 時則可用以下方式實作:
template<typename T, typename Tag, template<typename> class... Skills>
struct StrongType : private Skills< StrongType<T, Tag, Skills...> >...
{};

// Use mixin classes
template<typename T>
using Meter = StrongType<T, struct MeterTag, Addable, Printable>;

using Surname = StrongType<std::string, struct SurnameTag, Printable>;
以上的例子展示了只用一個 mixin 或兩個 mixin 類別的方法。

沒有留言:

張貼留言