: public Type {}; class Array { Type& operator[](uint i); }; class IntArray : public Array { Int& operator[](uint i); }; Type Int Array IntArray Co-variant return type 必須繼承 Type
class Int { static void doSomething(); }; template<typename T> class Array { T& operator[](uint i) { T::doSomething(); } }; typedef Array<Int> IntArray; Array IntArray T Int Int Constraint relation Int 不用繼承任何人, 但是要保證存在被使 用的 interfaces
template<size_t N> class Foo {}; Foo<Variable::Value> foo; // get the value class Variable { public: enum { Value = 10; // assign a value }; }; ‣ 取值:在 template argument 拿出 enum 或 constant member variable 的值。
原 template 為 else part • Condition 是由上而下,先碰到的先 match template<size_t N> class Foo { enum { Value = 6}; }; template<> class Foo<5> { enum { Value = 5}; }; template<> class Foo<10> { enum { Value = 10}; }; if (N == 5) { Value = 5; } else if (N == 10) { Value = 10; } else { Value = 6; }
argument 已知 template<typename A, typename B> class Foo { enum { Value = 6}; }; template<typename A> class Foo<A, int> { enum { Value = 5}; }; template<typename B> class Foo<double, B> { enum { Value = 10}; }; if (B == int) { Value = 5; } else if (A == double) { Value = 10; } else { Value = 6; }