Seite 130 von 202 ErsteErste ... 3080120126127128129130131132133134140180 ... LetzteLetzte
Ergebnis 1.936 bis 1.950 von 3026

Thema: [Programmiererstammtisch] "Zum ächzenden Compiler"

  1. #1936
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Also danke schon mal, das hilft auf jeden Fall fürs erste

    Nur wie würde jetzt eine Methode 'executeSetFunction' funktionieren, die die in einer Klassenvariable gespeicherten Methode (auch hier nochmal die Frage, wie die aussieht, die muss ja scheinbar static sein?) ausführt?

    Code:
    template <typename R, typename A>
    void executeSetFunction(){
    function(A);
    }
    Wobei function dann Typ F oder std::function<R (A)> hat.
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

  2. #1937
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Dann brauchst du ein Klassentemplate, kein Methodentemplate. Es reicht dann eine gewöhnliches Attribut aus.

  3. #1938
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Hier mal ein Beispiel:

    Code:
    #include <vector>
    #include <functional>
    
    template <typename ...Args>
    class Signal
    {
    private:
    	typedef std::function<void(Args...)> Action;
    	
    	std::vector<Action> actions;
    
    public:
    	void connect(const Action& f) { actions.push_back(f); }
    	
    	void emit(Args... args)
    	{
    		for(const Action& f : actions) { f(args...); }
    	}
    };
    Beispielanwendung:

    Code:
    void foo(int x, double y)
    {
    	std::cout << x << ", " << y << std::endl;
    }
    
    struct S
    {
    	void operator()(int x, double y) { std::cout << "Another action: " << x << ", " << y << std::endl; }
    };
    
    int main()
    {
    	Signal<int, double> s;
    	s.connect(foo);
    	s.connect(S());
    	s.emit(42, 3.1);
    
        return 0;
    }
    Weil "connect" hier keine Templatemethode ist kann man sowohl Funktionszeiger als auch Objekte mit operator() übergeben.
    Die "..." stehen für Templateparameterpacks. Beim Verwenden kann man eine beliebige Anzahl an Typen übergeben.

  4. #1939
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Wow vielen vielen Dank
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

  5. #1940
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Also neues Problem:

    Kann ich Template Objekte irgendwie in einen Vektor/Array packen und dann die Template Methoden aufrufen? Wäre die zweite Bedingung nicht, könnte ich ja eine dummy Überklasse erstellen. Dann hätte ich aber halt keinen Zugriff auf die Methoden.
    Ich habe jetzt schon gelesen, dass es da Methoden über zusätzliche Bibliotheken wie boost::any gibt, aber geht es auch irgendwie nur über die Standardbibliothek?
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

  6. #1941
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Wie wäre es mit std::tuple?

  7. #1942
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Ich verstehe womöglich nicht worauf du hinaus willst, aber bei tuple muss ich ja trotzdem Typen angeben?
    Was auch ginge, wäre so eine Art "oder Aufzählung". Da ich ja weiß, welche Templatetypen ich in den Vector packe, wäre auch sowas in der Art vector<TempClass<Type1 or Type2 or Type3 or...>> in Ordnung, wobei TempClass dann natürlich nur die gegebenen Typen haben darf. Auch wenn das natürlich nervig wird, wenn man das mal erweitern will.
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

  8. #1943
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Dann verwende einfach std::make_tuple.

    Hier ein Beispiel von cppreference:

    Code:
    #include <iostream>
    #include <tuple>
    #include <functional>
     
    std::tuple<int, int> f() // this function returns multiple values
    {
        int x = 5;
        return std::make_tuple(x, 7); // return {x,7}; in C++17
    }
     
    int main()
    {
        // heterogeneous tuple construction
        int n = 1;
        auto t = std::make_tuple(10, "Test", 3.14, std::ref(n), n);
        n = 7;
        std::cout << "The value of t is "  << "("
                  << std::get<0>(t) << ", " << std::get<1>(t) << ", "
                  << std::get<2>(t) << ", " << std::get<3>(t) << ", "
                  << std::get<4>(t) << ")\n";
     
        // function returning multiple values
        int a, b;
        std::tie(a, b) = f();
        std::cout << a << " " << b << "\n";
    }

  9. #1944
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Achsoo, ja daran habe ich jetzt gar nicht gedacht. Danke
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

  10. #1945
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Das Problem an tupel ist natürlich, dass man nicht variabel auf die einzelnen Objekte zugreifen kann
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

  11. #1946
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zur Kompilezeit geht das.

  12. #1947
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Also aber sowas wie get<i>(tuple) geht halt nicht für nicht konstantes i.
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

  13. #1948
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Muss i variabel zur Laufzeit sein oder reicht zur Kompilezeit?

  14. #1949
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Beispiel für die Kompilezeitvariante:

    Code:
    template <size_t index>
    auto f(const std::tuple<int, double> t)
    {
    	return std::get<index>(t);
    }
    
    
    int main()
    {
    	auto t = std::make_tuple(42, 3.1);
    
    	std::cout << f<0>(t) << ", " << f<1>(t) << std::endl;
    
    	int dummy;
    	std::cin >> dummy;
    
        return 0;
    }

  15. #1950
    reztuneB retreirtsigeR Avatar von EpicFail
    Registriert seit
    16.11.11
    Beiträge
    3.827
    Also es muss variabel zur Laufzeit sein

    Das Problem ist natürlich, dass man in get<> nur constexpr int schreiben kann und man (meines Wissens) logischerweise nicht von int in constexpr int umwandeln kann.

    Edit: Noch ne ganz blöde Frage hinterher: Welchen Vorteil hat deine Implementation eigentlich gegenüber einfach get<0>(t) ?
    Geändert von EpicFail (02. April 2018 um 14:20 Uhr)
    Zitat Zitat von Austra Beitrag anzeigen
    Dort herrscht Dauerkrieg zwischen den Feminazi-Ökofaschisten und und Konservativen-FDP-AfD-Nazis

Seite 130 von 202 ErsteErste ... 3080120126127128129130131132133134140180 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •