2016-08-28 2 views
1

Gibt es eine Möglichkeit in C#, eine Funktion wie folgt zu erweitern?Hinzufügen von Funktionalität zu bereits vorhandenen Funktion (C#, C++)

void foo() 
{ 
    // function body, instructions 

    return; 
} 

und dann an anderer Stelle im Code

foo += (x) => { // some functionality } 

die in der Praxis die Lambda-Funktionalität hinzufügen, würde am Ende einer foo() Ausführung abgefeuert werden.

  • Wie wäre der Name und die internen Details eines solchen Mechanismus?
  • Ist so etwas in C++ möglich?
+0

Sie können eine Liste von Funktionen haben und sie in Reihenfolge aufrufen und zu dieser Liste hinzufügen. Aber 'C++' ist eine kompilierte Sprache, Sie können die eigentlichen Funktionen zur Laufzeit nicht bearbeiten. – Galik

+1

Ist C# nicht auch eine kompilierte Sprache? – V0ldek

+0

Aber C# ist auch eine kompilierte Sprache @Galik –

Antwort

3

Ihr Beispiel wird nicht mit der Nachricht zusammenstellen:

error CS1656: Cannot assign to 'foo' because it is a 'method group' 

Es ist nicht möglich, solche Sachen zu tun. Was Sie gesehen haben, war wahrscheinlich operator += for events. Hier ist ein example with a lambda.

In Bezug auf C++

Es ist nicht möglich, einen Anruf an das Ende einer anderen Funktion (die gleichen wie für C#) hinzuzufügen. Sie können jedoch Ereignisse implementieren und den Operator + = überladen, damit Ihre Ereignisse Zeiger auf Funktionen akzeptieren.

+0

Können Sie mir mehr Implementierung in C++ sagen? – V0ldek

+0

Es ist zu viel, um in dem Kommentar zu antworten.Google 'operator überladen von C++', 'Aufruf der Funktion von Zeiger C++', und dann 'delegiert C++'. –

1

Es ist nur eine Möglichkeit, Ihnen zu zeigen, dass eine einminütige Testversion Ihnen einen Einblick geben kann. Aber wie Kirill Daybov in einen seines Kommentar erwähnt würde ich Sie ermutigt, delegieren c to google ++, finden Sie Artikel mit vielen stärkeren technischen Hinweisen finden

#include <iostream> 
#include <list> 
#include <functional> //c++11 

using namespace std; 

//For exercice only, C++11 required 
template<typename U> class naive_delegate 
{ 
    list<function<void(U)>>_list; 

    public: 
    naive_delegate<U> & operator+= (function<void(U)> && fref) 
    { _list.push_back(fref); return *this;} 
    void operator()(U && input_param) 
    { 
     if (_list.empty()) 
      cout << "Nothing to do for call of delegate with param " << input_param << endl; 
     else 
      for (const auto & elem : _list) 
       elem(input_param); 
    } 
}; 
void anwser(int i)  { cout << "The answer is " << i << endl;  } 

int main() 
{ 
    naive_delegate<int> ndel; 

    ndel(1); 

    ndel += [](int i) { cout << "What is the answer ? " << endl; }; 
    ndel += anwser; 

    ndel(42); 

    return 0; 
} 

Die Ergebnisse sind

Nothing to do for call of delegate with param 1 
What is the answer ? 
The answer is 42 

Beachten Sie, dass unter andere, ich bin nicht in der Lage, Entfernung zu behandeln (- =) ...

Verwandte Themen