Nieznany typ argumentu w funkcji.

0

Mam pytanko,
Chciałbym, aby funkcja mogła przyjmować dowolny argument, bez użycia overloadingu.

rettypr functionCopy(variant v) {
  return v.copy();
}

I chcę to wywołać tak:

myType t = functionCopy(myType(true));

Próbowałem użyć template'ów, ale bez efektów.

0

Template'y albo metody/klasy wirtualne...
Przy template'ach wyglądało by to tak:

template <class T>
T functionCopy(T v){
      return v.copy();
}

Ale zanim tego użyjesz, to lepiej zapoznaj się dobrze z tą techniką, bo bywa zdradliwa ;)/

0

raczej template.. wymuszenie aby variant byl wirtualny to tak troche nie ten :)

template <class T>
T functionCopy(T const & v) {
  return v.copy();
}

i to powinno zalatwic sprawe

edit: aa.. i tylko to umiesc w pliku .h takim, zeby wszedzie gdzie potrzeba zostal zincludeowany.. w .cpp raczej template'ow nie dawaj :)

edit#2: lol.. chyba Pawel tez edytowal post, bo jak pisalem kodzik template'a to u niego jeszcze nie bylo :))))

0

Dzięki na odpowiedź.
A jest możliwość, aby nie trzeba było podawać czegos takiego i nie stosować klas wirtualnych:

functionCopy<MyType>(x)

Tylko:

functionCopy(x)
0

Do czegoś takiego potrzebujesz języka bez statycznego wiązania typów, np. smalltalka, basha, pythona(tego nie jestem pewny)
W ocamlu część funkcji może przyjmować zmienne dowolnych typów, jako argumenty, ale nie wszystkie(jeżeli np. stosujemy jakąś operację dotyczącą tylko jakiegoś konkretnego typu)

http://wazniak.mimuw.edu.pl/index.php?title=Paradygmaty_programowania/Wyk%C5%82ad_2:_Semantyka_zmiennych#Wi.C4.85zanie_typu

0

gdzieś się zgubiłem. funkcję szablonową przecież wywołuje się tak: functionCopy(x) i C++ samo rozwija to na podstawie tego, jaki jest typ x-a. Jeszcze nigdy nie widziałem takiego wywołania funkcji, functionCopy<MojTyp>(x) - jakkolwiek da się tak wywołać oczywiście.

dopisane:
swoją drogą to stawiasz dziwne warunki - to tak, jakbyś powiedział: hej, chcę stworzyć swój własny typ złożony, ale bez użycia class i struct.

0

wywolanie takie jest potrzebne w momencie gdy kompilator nie moze sie domyslic o jaki typ chodzi, np. masz specjalizacje dla F(long long) i F(int) a odpalasz F('c'). niemniej tez totalnie nie rozumiem w czym problem.. btw, beben_, nikt tutak Ci nie proponuje wirtualnych, one w niczym Ci nie pomoga, chyba ze wzsystko na opak postawisz

0

Naczytałem się kursów o templatach, może nie zrozumiałem, ale byłem przekonany że za każdym przypadku trzeba podawać <typ> podczas używania funkcji opartej na templatach. W każdym razie dzięki za pomoc i kod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1