C++ Funktions-Argument Typumwandlung von bool zu int?

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo Coders,

wenn man eine Funktion hat, die ein Argument des Typs std::vector<int> besitzt und man möchte das die Funktion aber den Typ std::vector<bool> verarbeitet, wie geht das? Im Prinzip enthält die bool die Werte 0 und 1 daher sollte von meiner Logik her das verarbeiten durch eine Funktion mit int Argument gehen weil 0 und 1 logischerweise erlaubte Werte von int darstellen.
Es geht um C++ und der Wert wird als reference übergeben.


Code:
void Funktion(std::vector<int> &var)
{
   //
}

std::vector<bool> var;

// Funktionsaufruf
Funktion(var); // geht nicht
Funktion((int)var); // geht nicht
Funktion((std::vector<int>)var); // geht nicht

Die Funktionsaufrufe gehen so nicht, wie könnte man das Argument dazu bringen die bool als int zu verarbeiten?

Gruß
 
mach die Funktion zu einer Template-Funktion, damit sollte es gehen:


template <typename T>
void function(std::vector<T>& vec){

}
int main() {

std::vector<bool> f1;
std::vector<int> f2;


function(f1); //geht
function(f2); //geht

return 0;
}
 
Zuletzt bearbeitet:
Die Funktion überladen mit dem entsprechenden bool vector oder vielleicht suchst du auch Templates.

Abgesehen davon den Sticky beachten, dass das hier kein Hausaufgabenforum ist.
 
Zuletzt bearbeitet: (Quark entfernt)
daher sollte von meiner Logik her das verarbeiten durch eine Funktion mit int Argument gehen
C++ ist halt eine relativ streng typisierte Sprache. In python ginge das wahrscheinlich.
C++ erlaubt es dir, solange du keine vector hast sondern nur einzelne Elemente.
Dh
Code:
#include <iostream>
void Funktion(int x)
{
    std::cout << x << std::endl;
}
int main ()
{
  bool a = true;
  Funktion(a);
  return 0;
}
funktioniert und kompiliert sogar mit -Wall -Wextra -Wpedantic ohne warning.

Eine Lösung ist for_each

Code:
// for_each example
#include <iostream>     // std::cout
#include <algorithm>    // std::for_each
#include <vector>       // std::vector

void myfunction (int i)
{
  std::cout << ' ' << i;
}

std::vector<bool> myvector;

int main () {
  myvector.push_back(true);
  myvector.push_back(false);

  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';

  return 0;
}

Ich persönlich finde so implizite (versteckte) casts aber sehr unschön... dann lieber einen manuelle for-loop und jedes element einzeln mit static_cast<bool> für den Funktionsaufruf aufbereiten. Dann versteht man (imho) den Code besser.
 
Zuletzt bearbeitet:
Danke für die Antworten. Mit einem Funktionstemplate (mein erstes) hat es auf Anhieb geklappt, praktisch was c++ noch so alles auf Lager hat. Es war keine Hausaufgabe ich möchte lediglich die Anzahl unnötiger Funktionen reduzieren indem ich den Kram zusammenlege. Das mit for_each gucke ich mir auch noch an. Der Hinweis das vector bool sich evt anders verhält scheint wohl mit der "unechten" Referenz zu tun zu haben so weit ich das verstanden habe, ich übergebe ja per Referenz und es gibt in meinem Fall kein Compilererror und das schreiben und lesen über die Funktion läuft soweit korrekt, also es scheint ggf ein anderen Anwendungsfall zu betreffen.
 
Zuletzt bearbeitet:
Typisierung: stark vs. schwach / statisch vs. dynamisch

kuddlmuddl schrieb:
C++ ist halt eine relativ streng typisierte Sprache. In python ginge das wahrscheinlich.
Nein. Python ist zwar dynamisch aber stark typisiert. Sogar stärker als C++. Allerdings ist C++ statisch typisiert, so dass einem viele Dinge schon beim kompilieren auf die Füße fallen. Bei Python kannst Du dann Pech haben, dass das erst zur Laufzeit einen Fehler gibt.

Aber das nur am Rande.
 
Ein wenig kryptischer ist jenes:
Code:
...
std::vector<int> a = { 1,2,3 };
for_each(a.begin(), a.end(), [&](int t) { std::printf("%i ", t); });

Geht aber nur mit c++11. Es ist eventuell hilfreich, wenn man von java kommt und inline functions mag. Für mehr verweise ich auf std::function.

Die Warnung zu unused variables kann auch über das Makro Unused(.) "ausgehebelt" werden. Unschön ist es trotzdem.
 
Zurück
Oben