Mój przykład poniżej sugeruje, że niejawne konwersje z typów innych niż szablony na typy szablonów nie będą działać tak bezproblemowo, jak te obejmujące jedynie typy inne niż szablony. Czy istnieje sposób, aby je mimo wszystko działały?Niejawna konwersja do szablonu
Przykład:
struct point;
template<unsigned d> struct vec {
vec() { }
// ...
};
template<> struct vec<2> {
vec() { }
vec(const point& p) { /* ... */ } // Conversion constructor
// ...
};
struct point {
operator vec<2>() { return vec<2>(/* ... */); } // Conversion operator
};
template<unsigned d> vec<d> foo(vec<d> a, vec<d> b) {
return vec<d>(/* ... */);
}
template<unsigned d1, unsigned d2>
vec<d1 + d2> bar(vec<d1> a, vec<d2> b) {
return vec<d1 + d2>(/* ... */);
}
int main(int argc, char** argv) {
point p1, p2;
vec<2> v2;
vec<3> v3;
foo(v2, p1);
foo(p2, v2);
foo(p1, p2);
bar(v3, p1);
}
Czy istnieje sposób, aby ten kod automatycznej konwersji z point
do vec<2>
?
wiem, że mogę przeciążać foo
i bar
aby umożliwić point
argumentów, delegując do realizacji vec
użyciu wyraźnej konwersji. Ale zrobienie tego dla wszystkich kombinacji parametrów stanie się żmudne, szczególnie dla funkcji z wieloma takimi parametrami. Nie interesują mnie rozwiązania, w których muszę kopiować kod dla każdej kombinacji parametrów każdej funkcji.
Wygląda na to, że ani konstruktor konwersji, ani operator rzutowania nie są w stanie tego osiągnąć. Przynajmniej mój gcc 4.7.1 zgłasza no matching function call
, mimo że nazwa żądanej funkcji w zawiadomieniu, stwierdzając, że ‘point’ is not derived from ‘vec<d>’
.
Która linia podaje ten błąd? Ponadto "unsigned' nie jest typem C++. –
@James: Błędy są zgłaszane dla linii z wywoływanymi funkcjami, mimo że w notatkach wspomniano również o innych liniach. Możesz skopiować i skompilować powyższy kod, ponieważ jest on samodzielny. Sekcja 3.9.1 [standard C++ 11] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf) nazywa się "unsigned", więc dlaczego to nie jest typ C++, współdzielony z C? – MvG
Nie, deklaruje 'unsigned char',' unsigned short int', 'unsigned int',' unsigned long int' i 'unsigned long long int' jako unsigned integer types. –