Beste Tweakers,
Ik gebruik best wel eens std::vectors waarbij ik de inhoud van een type naar een ander moet converteren.
Ik dacht dit eens generiek op te lossen door een std::transform oplossing te wrappen:
wat ik dan bijvoorbeeld zo dacht aan te roepen:
Dit compiled niet met de melding: "error C2780: 'float static_cast_func<T>::operator ()(const T1 &) const' : expects 1 arguments - 0 provided"
Met een beetje testen denk ik dat dit komt omdat de functie niet juist geinlined kan worden (als ik de body van de eerste ConvertSeries simpelweg return func(1.) (en het return type natuurlijk T2 maak), dan compileerd het prima). Vervelend.
Maargoed, hoe zouden jullie mijn probleem oplossen? Het gaat mij er vooral om dat ik makkelijk kan converteren, gebruik makend van een default functor of een user-provided.
Bedankt voor het meedenken!
Ik gebruik best wel eens std::vectors waarbij ik de inhoud van een type naar een ander moet converteren.
Ik dacht dit eens generiek op te lossen door een std::transform oplossing te wrappen:
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
| // standard caster functions template <typename T> struct static_cast_func { template <typename T1> T operator()(const T1& x) const { return static_cast<T>(x); } }; // converts elements of type T1 in input vector to type T2 and put in output vector // conversion by default happens with a functor wrapping static cast, but user can // provide his own functor if needed template <class T1, class T2, class F1> inline void ConvertSeries (const std::vector<T1> is, std::vector<T2>& os, F1 func) { os.clear(); std::transform(is.begin(), is.end(), std::back_inserter(os), func()); } // geen default template arguments bij functies, dus dan maar zo // (weet niet of ik wel een default argument voor func hierboven zou // kunnen opgeven, compiler zou daar het type van F1 uit moeten // kunnen halen, maar met de andere errors waar ik tegenaan loop // kan ik dit niet testen) template <class T1, class T2> inline void ConvertSeries (const std::vector<T1> is, std::vector<T2>& os) { ConvertSeries(is, os, static_cast_func<T2>()); } |
wat ik dan bijvoorbeeld zo dacht aan te roepen:
C++:
1
2
3
4
5
| ConvertSeries(bgColor_, bgColor, static_cast_func<float>()); // of, aangezien dit de standaard functor is: ConvertSeries(bgColor_, bgColor); // vergelijk met: std::transform(bgColor_.begin(), bgColor_.end(), std::back_inserter(bgColor), static_cast_func<float>()); |
Dit compiled niet met de melding: "error C2780: 'float static_cast_func<T>::operator ()(const T1 &) const' : expects 1 arguments - 0 provided"
Met een beetje testen denk ik dat dit komt omdat de functie niet juist geinlined kan worden (als ik de body van de eerste ConvertSeries simpelweg return func(1.) (en het return type natuurlijk T2 maak), dan compileerd het prima). Vervelend.
Maargoed, hoe zouden jullie mijn probleem oplossen? Het gaat mij er vooral om dat ik makkelijk kan converteren, gebruik makend van een default functor of een user-provided.
Bedankt voor het meedenken!