forked from rosh/MQL5Book
63 lines
1.9 KiB
MQL5
63 lines
1.9 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| TemplatesConverter.mq5 |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
| |
#define MAX_LONG_IN_DOUBLE 9007199254740992
| |
// FYI: ULONG_MAX 18446744073709551615
| |
| |
//+------------------------------------------------------------------+
| |
//| 2-way bitwise exact conversion between T1 and T2 |
| |
//+------------------------------------------------------------------+
| |
template<typename T1,typename T2>
| |
class Converter
| |
{
| |
private:
| |
// nested template is used here for demo purpose:
| |
// more direct approach is to make it a simple union (not a template)
| |
// and declare L and D fields by T1 and T2 meta-types
| |
template<typename U1,typename U2>
| |
union DataOverlay
| |
{
| |
U1 L;
| |
U2 D;
| |
};
| |
| |
DataOverlay<T1,T2> data;
| |
| |
public:
| |
T2 operator[](const T1 L)
| |
{
| |
data.L = L;
| |
return data.D;
| |
}
| |
| |
T1 operator[](const T2 D)
| |
{
| |
data.D = D;
| |
return data.L;
| |
}
| |
};
| |
| |
| |
//+------------------------------------------------------------------+
| |
//| Script program start function |
| |
//+------------------------------------------------------------------+
| |
void OnStart()
| |
{
| |
Converter<double,ulong> c;
| |
| |
const ulong value = MAX_LONG_IN_DOUBLE + 1;
| |
| |
double d = value; // possible loss of data due to type conversion
| |
ulong result = d; // possible loss of data due to type conversion
| |
| |
Print(value == result); // false
| |
| |
double z = c[value];
| |
ulong restored = c[z];
| |
| |
Print(value == restored); // true
| |
}
| |
//+------------------------------------------------------------------+
|