使えそうなC++テンプレートのサンプル集
型が異なるが共通のアルゴリズムをベースクラスに実装し派生クラスに独自のメソッドを追加する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#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()でやるより冗長性が無くなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#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"; } |
コメントを残す