#include <iostream>
enum ConvFactor {
HZ = 1,
KHZ = 1000,
MHZ = 1000000,
GHZ = 1000000000
};
template <ConvFactor CF>
class Frequency
{
public:
explicit Frequency(double val)
: val_(val / CF)
{
std::cout << " CF: " << CF << std::endl;
}
template<ConvFactor LocalCF>
explicit Frequency(Frequency<LocalCF> const & freq)
: val_((freq.Val() * LocalCF) / CF)
{
std::cout << "LocalCF: " << LocalCF << " CF: " << CF << std::endl;
}
//template<ConvFactor CF>
Frequency<CF> operator*(double mult)
{
return Frequency<CF>(val_ * mult);
}
double Val() const { return val_; }
double operator()() { return val_; }
private:
double val_;
};
typedef Frequency<HZ> Hz;
typedef Frequency<KHZ> KHz;
typedef Frequency<MHZ> MHz;
typedef Frequency<GHZ> GHz;
template<ConvFactor CF>
Frequency<CF> doSomething(Frequency<CF> freq)
{
// return Frequency<CF>(freq * 2.0);
return (freq * 2.0);
}
//KHz doSomething2(KHz khz)
//{
// return khz *<KHZ> 2.0;
//}
int main()
{
Hz hz = Hz(1000);
KHz khz = KHz(hz);
khz = KHz( doSomething<KHZ>(khz) );
// khz = doSomething2(khz);
MHz mhz1 = MHz(hz);
MHz mhz2 = MHz(khz);
GHz ghz1 = GHz(hz);
GHz ghz2 = GHz(khz);
GHz ghz3 = GHz(mhz1);
GHz ghz4 = GHz(mhz2);
khz = doSomething(KHz(mhz2));
std::cout << hz() << " " << khz() << " " << mhz2() << " " << " " << ghz1() << std::endl;
}