"Undefinierte" Variable an Funktion übergeben

Hallo,

ich will gar nicht zu weit ausschweifen also daher:

Ich möchte eine Funktion wie folgt erstellen, um nicht überall im Programm doppelte print oder println - Anweisungen geben zu müssen:

void print(input){
  Serial.print(input);
  Telnet.print(input);
}

Dummerweise muss man der Funktion ja den Variablentyp mitgeben also funktioniert das so nicht.
Bekommt man das irgendwie hin, bzw. wie macht das z.B. die Serial.print - Anweisung, der es ja egal ist welchen Variablentyp man übergibt?

Gruß Alex

Es ist ihr nicht egal.
Denn sie ist mehrfach überladen.

Ansonsten wurden Templates für sowas erfunden.
Auch kannst du deine Datenstrukturen Printable machen. Dann geben sie sich selber aus.

alles schon gesagt.

Entweder google nach "template c++" oder "function overload c++" (oder schau in die Print.h).

Edit1: Wobei, evtl. gibt es auch eine 3te Variante:
mach dir eine eigene Klasse, lass diese von Print.h erben und implementiere eine write methode in der du beide Interfaces aufrufst (also einmal Serial und einmal die Telnet) ... könnte unterm strich vieleicht sogar die "kleinste" Lösung sein. Denn das würde print und println auf einmal abdecken.

Edit2: nur so als PoC

class Multi : public Print
{
  public:
  virtual size_t write(uint8_t c)
  {
    Serial.write(c);
    Serial.write(c); // halt ein telnet write blabla
    return 1; // assume success
  }
};

Multi multi;

void setup() {
  Serial.begin(115200);
  //und das Telnet.begin blabla
  multi.print(1);
  multi.print("a");
  multi.println("fein");
  multi.println(F("das auch"));
}

void loop() {
  // put your main code here, to run repeatedly:
}

https://wokwi.com/arduino/projects/319774366957044306

Man kann Streams auch Splitten, quasi Y-Stücke/Verteiler bauen
(aus meiner Wühlkiste)

#include <SoftwareSerial.h>



class Verteiler: public Print
{
  private:
  Print &kanalA;
  Print &kanalB;

  public:
  Verteiler(Print &kanalA,Print &kanalB):kanalA(kanalA),kanalB(kanalB){}
  virtual size_t write(uint8_t val) override
  {
    kanalA.write(val);
    kanalB.write(val);
    return 1; // ohne erfolgstest
  }
};

SoftwareSerial mySerial(10, 11); // RX, TX
Verteiler verteiler {mySerial,Serial};

void setup() 
{
  Serial.begin(9600);
  mySerial.begin(4800);
  verteiler.println("Ich werde auf 2 Geraeten ausgegeben");
}

void loop() 
{

}

Hei
da warst du wohl schneller....

Wow erstmal danke für eure Antworten!

Damit kann ich bestimmt was anfangen, allerdings werde ich mich doch mal ein wenig in die Themen "Klassen" und "Templates" und "Überladung" einarbeiten müssen, um auch zu verstehen, was ich dann da eigentlich gemacht habe. Kurz überflogen hab ich das schon, scheint aber sehr komplex zu sein.
Vielleicht habt ihr ja einen Tipp für gute Tutorials.

Danke Danke Danke

Hier findest du die "Wahrheit", in aller Ausführlichkeit.
https://en.cppreference.com/w/