Если вы хотите использовать только таймеры, основанные на реализации машинного таймера (который должен быть определен на этапе компиляции для всей программы, я полагаю), я бы просто использовал typedef
и, возможно, некоторую магию препроцессора, чтобы сделать это правильно:
[...]
#if TIMER_LONG // Here you should somehow check what type is used on target platform.
typedef Timer<long> implTimer;
typedef FpsMeter<long> implFpsMeter;
#else // If eg. using double?
typedef Timer<double> implTimer;
typedef FpsMeter<double> implFpsMeter;
#fi
Это должно привести к тому, что пользовательский код не будет знать о фактическом используемом typee, если он использует implTimer и implFpsMeter.
Если вы имеете в виду, что некоторые части кода будут использовать другой TimerImpl, то вы должны сделать ваш FpsMeter
класс полиморфным
class FpsMeter{
public:
virtual double fps()=0;
virutal void newFrame()=0;
[...]
//Class counts new frames and using internal timer calculates fps.
};
template <typename T>
class FpsMeterImpl: public FpsMeter{
TimerImpl<T>* timer;
public:
FpsMeterImpl(TimerImpl<T>* timer);
virtual double fps();
virutal void newFrame();
};