Template Metaprogramming
Template Metaprogramming
C++
Assembly
Machine Code
Metaprogramming introduces
new abstractions into the host language.
So what exactly is
template metaprogramming?
Template
Compiler
This is a
metaprogramming step!
C++ Compiler
Machine
Code
Vector
Range Checking
Type T
Synchronization
template <typename T,
typename RangePolicy,
typename LockingPolicy>
class Vector
{
public:
T getAt(int index);
void setAt(int index, T value);
};
template <typename T,
typename RangePolicy,
typename LockingPolicy>
class Vector: public RangePolicy,
public LockingPolicy
{
public:
T getAt(int index);
void setAt(int index, T value);
};
};
Implementer Code
template <typename T,
typename RangePolicy,
typename LockingPolicy>
T Vector<T, RangePolicy, LockingPolicy>::
getAt (int position)
{
LockingPolicy::Lock lock;
ErrorPolicy::CheckBounds(position,
this->size);
return this->elems[position];
}
Implementer Code
template <typename T,
typename RangePolicy,
typename LockingPolicy>
T Vector<T, RangePolicy, LockingPolicy>::
getAt (int position)
{
LockingPolicy::Lock lock;
ErrorPolicy::CheckBounds(position,
this->size);
return this->elems[position];
}
Implementer Code
template <typename T,
typename RangePolicy,
typename LockingPolicy>
T Vector<T, RangePolicy, LockingPolicy>::
getAt (int position)
{
LockingPolicy::Lock lock;
RangePolicy::CheckRange(position,
this->size);
return this->elems[position];
}
Client Code
int main()
{
Vector<int, ThrowingErrorPolicy,
NoLockingPolicy> v;
for(size_t k = 0; k < kNumElems; ++k)
v.push_back(k);
/* ... etc. ... */
}
return 0;
Or this...
int main()
{
Vector<int, AssertingErrorPolicy,
PThreadLockingPolicy> v;
for(size_t k = 0; k < kNumElems; ++k)
v.push_back(k);
/* ... etc. ... */
}
return 0;
Or even this...
int main()
{
Vector<int, NoErrorPolicy,
NoLockingPolicy> v;
for(size_t k = 0; k < kNumElems; ++k)
v.push_back(k);
/* ... etc. ... */
}
return 0;
Multiple dispatch.
Design patterns.
Code optimization.
Recommended Reading
More template
metaprogramming
than you'll know what
to do with.
Very advanced
material; be prepared
to be overwhelmed!
Considered the
seminal work in
modern C++
programming.