Ik was aan het testen met templates en liep tegen het volgende probleem aan.
Als je een float en een integer optelt en in een float opslaat, dan wordt de floating point waarde behouden. Als je echter templates maakt die min of meer hetzelfde gedrag als de built-in types vertonen, dan is deze floating point waarde niet behouden.
Ik vroeg me af of er een manier is om dit built-in gedrag te kopieren naar custom classes.
Hier een compileerbaar voorbeeld:
Als ik deze code lees, dan snap ik wel waarom "Custom<float> C = A + B;" als integer berekend word, ik vraag me alleen af waarom de built-in types hier wel mee om kunnen gaan.
Als iemand hier een licht op kan schijnen hoor ik het graag
Als je een float en een integer optelt en in een float opslaat, dan wordt de floating point waarde behouden. Als je echter templates maakt die min of meer hetzelfde gedrag als de built-in types vertonen, dan is deze floating point waarde niet behouden.
Ik vroeg me af of er een manier is om dit built-in gedrag te kopieren naar custom classes.
Hier een compileerbaar voorbeeld:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| #include <iostream> template< class T > class Custom { public: Custom( const T &t ) : data( t ) {} template< typename U > operator Custom< U >() { return Custom< U >( this->value() ); } const T& value() const { return data; } private: T data; }; template< typename T, typename U > Custom< T > operator+( const Custom< T > &A, const Custom< U > &B ) { return Custom< T >( A.value() + B.value() ); } using namespace std; int main( int, char** ) { Custom<int> A( 1 ); Custom<float> B( 0.1 ); Custom<float> C = A + B; Custom<float> D = static_cast< Custom<float> >( A ) + B; int a = 1; float b = 0.1; float c = a + b; std::cout << "standard: " << c << std::endl; std::cout << "custom: " << C.value() << std::endl; std::cout << "custom with explicit cast: " << D.value() << std::endl; return 0; } |
Als ik deze code lees, dan snap ik wel waarom "Custom<float> C = A + B;" als integer berekend word, ik vraag me alleen af waarom de built-in types hier wel mee om kunnen gaan.
Als iemand hier een licht op kan schijnen hoor ik het graag
oprecht vertrouwen wordt nooit geschaad