型が異なるが共通のアルゴリズムをベースクラスに実装し派生クラスに独自のメソッドを追加する

#include <cstdlib>
#include <iostream>

template<typename T>
class IBase
{
public:
    virtual void Increment(T& val) = 0;
};

template<typename T>
class Base : public IBase<T>
{
public:
    void Increment(T& val) override
    {
        ++val;
    }
};

class Derived : public Base<int>
{
public:
    void DoSomething();
};

class Derived2 : public Base<float>
{
public:
    void DoNothing();
};

int main()
{
    Derived derived;
    int val = 4;
    derived.Increment(val);
    Derived2 derived2;
    float fVal = 2.f;
    derived2.Increment(fVal);
    std::cout << "val: " << val << "\n";
    std::cout << "fVal: " << fVal << "\n";
    return 0;
}

 

ストレージサイズが異なるデータ型の定義

例の様に何個も定義する場合にsizeof()でやるより冗長性が無くなる。

#include <iostream>

template<int Count>
struct RegisterFile
{
public:
    static const size_t RegisterCount = Count;
    int32_t m_Registers[Count];
};

typedef RegisterFile<16> SamplerRegisterFile;
typedef RegisterFile<32> RendererRegisterFile;
 
int main()
{
    std::cout << sizeof(SamplerRegisterFile) << "\n";
    std::cout << sizeof(RendererRegisterFile) << "\n";
    std::cout << SamplerRegisterFile::RegisterCount << "\n";
    std::cout << RendererRegisterFile::RegisterCount << "\n";
}