Wie löse ich das am Besten?



  • Hi,

    ich habe folgendes Problem: Ich möchte gerne eine Funktion SendToAll haben:

    void SendToAll(const std::string& msg)
    {
      for alleMeineClients
      {
        send(aktuellerClient, msg);
      }
    }
    

    Alles kein Problem. Aber ich möchte an einigen Stellen eine Ausnahme haben, also an einen Client nicht senden. Wie löse ich das am Besten? Soll ich eine Callback Funktion machen? Wäre auch blöd... Ich möchte nicht den gleichen Code für alle Varianten schreiben. Es gibt ja immer nur eine andere Bedinung WANN an diesen Client gesendet werden soll.

    Zum Beispiel soll an einigen Stellen wirklich an alle Clients gesendet werden. An einer anderen Stelle an alle Clients die bereits ein Login gemacht haben, etc... Dazu will ich aber nicht jedesmal eine neue Schleife machen sondern irgendwie eine Funktion nutzen... Schwer zu beschreiben. WAs denkt ihr?



  • Möglich ist die Nutzung von Funktoren:

    enum SendingCondition{
      SC_NONE,
      SC_LOGGEDIN,
      SC_WHATEVER
    };
    
    struct ConditionalSend{
      SendingCondition condition;
      ConditionalSend(SendingCondition sc) : condition(sc){ }
    
      void operator()(Client &c){
        switch(condition){
          case SC_LOGGEDIN: if (!c.loggedIn()) return;
          default:
        }
        c.send();
      }
    };
    
    std::for_each(all_clients.begin(), all_clients.end(), ConditionalSend(SC_LOGGEDIN));
    


  • Fellhuhn schrieb:

    Möglich ist die Nutzung von Funktoren:

    enum SendingCondition{
      SC_NONE,
      SC_LOGGEDIN,
      SC_WHATEVER
    };
    
    struct ConditionalSend{
      SendingCondition condition;
      ConditionalSend(SendingCondition sc) : condition(sc){ }
    
      void operator()(Client &c){
        switch(condition){
          case SC_LOGGEDIN: if (!c.loggedIn()) return;
          default:
        }
        c.send();
      }
    };
    
    std::for_each(all_clients.begin(), all_clients.end(), ConditionalSend(SC_LOGGEDIN));
    

    Sowas ähnliches scheint für mich genau richtig zu sein. Das ich da nicht selber drauf gekommen bin... Daaaanke 🙂


Log in to reply