<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Boost.preprocessor String-Vergleich]]></title><description><![CDATA[<p>Hallo!</p>
<p>Eigentlich eine recht einfach zu stellende Frage, aber die Lösung entzieht sich meinem Wissen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Also, ich brauche ein Makro welches zu return expandiert, wenn sein Argument nicht void ist. Habe es so versucht:</p>
<pre><code class="language-cpp">#define meins(arg) BOOST_PP_EXPR_IF(BOOST_PP_NOT_EQUAL(arg, void), return)
</code></pre>
<p>Leider expandiert es nur ins tiefste boost-gemakroe und sonst nix. Kann man irgendwie strings vergleichen? habe dazu leider nix gefunden, weder in der doku noch in mailinglisten etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/217972/boost-preprocessor-string-vergleich</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 11:32:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/217972.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Jul 2008 13:32:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 14 Jul 2008 13:32:25 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Eigentlich eine recht einfach zu stellende Frage, aber die Lösung entzieht sich meinem Wissen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Also, ich brauche ein Makro welches zu return expandiert, wenn sein Argument nicht void ist. Habe es so versucht:</p>
<pre><code class="language-cpp">#define meins(arg) BOOST_PP_EXPR_IF(BOOST_PP_NOT_EQUAL(arg, void), return)
</code></pre>
<p>Leider expandiert es nur ins tiefste boost-gemakroe und sonst nix. Kann man irgendwie strings vergleichen? habe dazu leider nix gefunden, weder in der doku noch in mailinglisten etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547120</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 14 Jul 2008 13:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 14 Jul 2008 13:38:21 GMT]]></title><description><![CDATA[<p>In welchem Zusammenhang brauchst du das denn? Vielleicht gibts ne elegantere Lösung als Makro-Gefrickel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547128</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547128</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 14 Jul 2008 13:38:21 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 14 Jul 2008 14:30:21 GMT]]></title><description><![CDATA[<p>hehe, die Frage wurde mir in #cpp auch schon gestellt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Ich schreibe ein Pluginsystem, welches um python-plugins erweitert werden kann. Dazu müssen Klassen in Python von meinen abstrakten Plugin-Basisklassen erben. Dazu braucht man in boost.python wrapperklassen, welche alle virtuellen funktionen der Klassen wrappen müssen, von denen in python abgeleitet wird. Damit wird die Polymorphie garantiert. Dazu müssen sehr viele funktionen geschrieben werden, die alle in etwa gleich aussehen:</p>
<pre><code class="language-cpp">// zwei Beispiele ( das folgende sind memberfunktionen der wrapperklasse):

std::string GetName() const
{
	return this-&gt;get_override(&quot;GetName&quot;);
}

virtual void DisplayHelp() const
{
        // Nur bei void darf eben kein return stehen :)
	this-&gt;get_override(&quot;DisplayHelp&quot;)();
}
</code></pre>
<p>Um das zu generieren möchte ich boost::preprocessor verwenden, klappt ja auch ziemlich gut eigentlich, nur der string-vergleich nicht so. Bis jetzt habe ich eine dritte Variable im preprocessorcode der angibt, ob return void ist oder nicht, damit kann ich dann das IF-Makro füttern.</p>
<p>PS: Mit template sgeht das ganze nicht, dadie funktionen verschiedene Namen haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547151</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 14 Jul 2008 14:30:21 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 14 Jul 2008 14:40:48 GMT]]></title><description><![CDATA[<p>Ich bin mir jetzt nicht mehr sicher, aber ich dachte return void, wäre erlaubt, zumindest wenn eine Funktion aufgerufen wird und nicht void steht. Also konkret:</p>
<pre><code class="language-cpp">void foo() { /* ... */ };

void bar() { return foo(); };

int main()
{
    bar();
    return 0;
}
</code></pre>
<p>Der MSVC2005 schluckt es jedenfalls, aber das könnte natürlich mal wieder daran liegen, dass er nicht ganz Standardkonform ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Falls du im übrigen keine Antwort zu den Preprocessor-Makros hier bekommst, da sie wohl nicht so oft verwendet werden, frag mal in der Mailing-List von Boost nach <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547161</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 14 Jul 2008 14:40:48 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 14 Jul 2008 14:49:03 GMT]]></title><description><![CDATA[<p>hm, komisch. Ich dachte immer, das wird nicht geschluckt. Also bei templates geht das jedenfalls nicht mitm msvc2005, dass man da ein return void macht. Deswegen dacht ich hier gehts auch nicht.</p>
<p>Naja... vielleicht findet sich ja noch jemand, der das verbessern kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Wenn nicht frag ich mal bei boost direkt an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547170</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 14 Jul 2008 14:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 14 Jul 2008 17:33:54 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>hm, komisch. Ich dachte immer, das wird nicht geschluckt. Also bei templates geht das jedenfalls nicht mitm msvc2005</p>
</blockquote>
<p>Genau wegen der Templates gibt es das Feature aber eigentlich. Ich kann's jetzt in VC2005 nicht nachvollziehen, im Nachfolger geht es aber AFAIR.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1547270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1547270</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 14 Jul 2008 17:33:54 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Sat, 22 Nov 2008 13:36:13 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich muss ds Thema noch einmal hochholen, da es in diesem Forum scheinbar keine PNs gibt, zumindest hab ich sie jetzt nicht gefunden. Also das geht hauptsächlich an Maxi.<br />
Und zwar bin ich auch gerade dabei ein Pluginsystem für mein C++ Programm zu schreiben, wobei halt die Plugins in Python geschrieben werden können. Dazu habe ich das Observer-pattern genutzt, um eine Art Eventsystem aufzubauen. Sprich: In Python leitet man von meiner C++ Observerklasse ab, kann sich dann für gewisse Events registrieren mit einer Instanz eben jener Klassen und sobald die Events in meinem Programm auftreten, werden die Update Methoden der Pythonklassen aufgerufen. Das hat soweit einigermaßen geklappt. Nur ist Problem war glaub ich das Slicing. Meine Register-Methode, die die Pythonobserver aufnimmt und den Events zu ordnet kann ja nur Observer erwarten. Daraus folgt, dass wenn in Python der abgeleiteten Observerklasse weitere Methoden hinzugefügt worden sind und diese von der Updatemethode aufgerufen werden, das ganze Programm abstürzt, da das abstrakte Observerinterface ja keine zusätzlichen Methoden kennt.<br />
Daher nun meine Frage: Wie hast du ds Pluginsystem realisiert, hattest du ähnliche Probleme und wie hast du sie gelöst?</p>
<p>Wäre für jede Antwort dankbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1618833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618833</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Sat, 22 Nov 2008 13:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Sun, 23 Nov 2008 17:22:41 GMT]]></title><description><![CDATA[<p>hi Gate! zeig mal etwas code, damit wird besser sehen wie du das machst.</p>
<p>bye</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619501</guid><dc:creator><![CDATA[maxxi]]></dc:creator><pubDate>Sun, 23 Nov 2008 17:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Sun, 23 Nov 2008 17:50:29 GMT]]></title><description><![CDATA[<p>also grob gesagt hab ich das ganze folgerndermaßen gemacht:</p>
<p>Ich hab wxPython mit meinen wx-libs kompiliert, damit ich wxWidgets in python und c++ benutzen kann (tut aber hier nichts zur Sache so richtig).</p>
<p>Und dann so:</p>
<pre><code class="language-cpp">import ai

class MyPlugin(ai.IGeneralPlugin):
	def GetName(self):
		return &quot;MyPlugin from Python&quot;

	def GetVersion(self):
		return &quot;vPython10&quot;

	def GetDescription(self):
		return &quot;Ein kelines einfaches python-plugin...&quot;

	def GetFileName(self):
		return &quot;PythonPlugin.py&quot;

	def DisplayHelp(self):
		wx.MessageBox(&quot;Hi, dies dies die kleine Beschreibung zum Plugin...&quot;)

	def Shutdown(self):
		# nothing to do
		return 0

	def Startup(self):
		#nothing to do
		# hier sollte dann Code rein, der das plugin im progreamm verfügbar macht,
                # bspw. Befehle zu den Menüs hinzufügen
                # dazu gibts den Befehl ai.getApp().Addcommand(Befehlsummer, &quot;Titel&quot;)
                print &quot;Habe das PyPlugin geladen!&quot;

		return 0

global generalpi

def Startup(a):
	global generalpi
	print &quot;Startup in Pythonplugin!&quot;
	app = ai.getApp()
	wndmain = ai.getWndMain()

	generalpi = MyPlugin()
	app.AddGeneralPlugin(generalpi)
	return 1

print &quot;Datei geladen...&quot;

// mit den Befehlen und Events hab ich das so gemacht,
// der selbe Code funktioniert auch in python, habs nur noch nicht benutzt
app-&gt;AddCommand(ID_PRINTIMAGE, (&quot;Drucken...&quot;), tr(&quot;&quot;), bm);
app-&gt;PushEventHandler(this);

// wobei this von wxEvtHandler abgeleitet ist und eine Methode OnPrint anbietet.
// mit bind müsste das aber auch gehen.
</code></pre>
<p>Aber ein bisschen Code, welches dein Problem zeigt, wäre schon nicht schlecht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619514</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 23 Nov 2008 17:50:29 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Sun, 23 Nov 2008 18:28:59 GMT]]></title><description><![CDATA[<p>maxxi schrieb:</p>
<blockquote>
<p>hi Gate! zeig mal etwas code, damit wird besser sehen wie du das machst.</p>
<p>bye</p>
</blockquote>
<p>Okay, ich versuchs einfach mal darzustellen:</p>
<pre><code class="language-cpp">struct Observer
{
  virtual void Update( Subject* ) = 0;
  virtual ~Observer(){};
};
</code></pre>
<p>Das ist erstmal die abstrakte Basisklasse des Observers wovon meine Cppklassen sowie die entsprechenden Pythonklassen erben sollen, damit sie auf Veränderungen im Programm reagieren können, indem sie jewils die Update() Methode implementieren.<br />
So, um sie für Python verfügbar zu machen, wird sie gewrappt:</p>
<pre><code class="language-cpp">struct Listener : Observer, boost::python::wrapper&lt;Observer&gt;
{
    Listener()
    {
     m_self = NULL;
    }
    Listener( PyObject* self_) : m_self(self_)
    {
        Py_XINCREF(m_self);
    }
    Listener( PyObject* self_, const Listener&amp; copy ) : Observer(copy), m_self(self_)
    {
        Py_XINCREF(m_self);
    }
    Listener( PyObject* self_, const Observer&amp; copy ) : Observer(copy), m_self(self_)
    {
        Py_XINCREF(m_self);
    }
    ~Listener() { Py_XDECREF(m_self); }

    virtual void Update(Subject*)
    {
        this-&gt;get_override(&quot;Update&quot;)();
    }
    PyObject *m_self;
};
</code></pre>
<p>Dabei bin ich mir allerdings nicht sicher, ob die ganzen Copy-Ctors notwendig sind aber bei meiner Recherche zu dem Problem hatte ich das dann so einfach mal übernommen.<br />
Für Python wird der Wrapper dann wie folgt verfügbar gemacht:</p>
<pre><code class="language-cpp">class_&lt;Listener, std::auto_ptr&lt;Listener&gt;, boost::noncopyable&gt;(&quot;Listener&quot;)
          .def(&quot;Update&quot;,pure_virtual(&amp;Listener::Update))
         ;
</code></pre>
<p>Folgend dann die Registrierungsmethode der Pythonobserver:</p>
<pre><code class="language-cpp">void Subscribe(Listener* listener,const std::basic_string&lt;wxChar&gt;&amp; sVar)
{
    //Hier wird deque anstatt vector genutzt, da bei Letzterem die Elemente nicht an der selben
    //Speicheradresse gehalten werden. Da aber eine Konstante Adresse für den Aufruf der Updatefunktion
    //vom VarManager aus nötig ist muss dieser Container genutzt werden.
    static std::deque&lt;Listener &gt;Listeners;
    Listener L = *listener;
    Listeners.push_back(L);
    VarManager::Get()-&gt;Subscribe(sVar, &amp;Listeners.back());
}
</code></pre>
<p>Noch für auto_ptr&lt;&gt; gewrappt:</p>
<pre><code class="language-cpp">void Subscribe_wrapper(std::auto_ptr&lt;Listener&gt; l, const std::basic_string&lt;wxChar&gt;&amp; sVar)
{
    Subscribe(l.get(), sVar);
    l.release();
}
</code></pre>
<p>Soweit also von Seiten des Cpp Programms. Der Varmanager ruft die Updatemethoden der Observer auf. Inzwischen erhalte ich bei Pythonoberservern allerdings immer unbehandelte exceptions, wenn Update aufgerufen wird. Durch einkapseln des Update Aufrufs mit try catch( ... ) konnte ich die exception auch nicht auffangen merkwürdig.<br />
Hier nochmal die Pythonseite:</p>
<pre><code class="language-cpp">class CfgListener(LoW.Listener):
        def Update(self,Subject):
            '''Hier weiterer Code der aufgerufen werden soll

CfgListener = CfgListener()
LoW.Cfg.Subscribe(CfgListener,&quot;Event&quot;)
</code></pre>
<p>Nun wie gesagt, momentan sieht es so aus, das ne unbehandelte Exception fliegt, wenn Update() aufgerufen wird. Ich war schon soweit, dass der Update Aufruf funktionierte, es aber zum Absturz kam wenn Code in eine andere Methode als der Update Methode ausgelagert wurde. Slicing?<br />
Wie gesagt wäre für jeden Hinweis dankbar, wie ich mein Vorhaben vernünftig umsetzen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619548</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Sun, 23 Nov 2008 18:28:59 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 24 Nov 2008 13:55:05 GMT]]></title><description><![CDATA[<p>kannst du die exception denn mit try {} catch(...) {} fangen?<br />
Evtentuell wird eine Exception vom Typ boost::error_already_set geworfen? Wenn ja, kannst du danach mit PyErr_Print (oder so ähnlich) den Fehler ausgeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619909</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 24 Nov 2008 13:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 24 Nov 2008 15:35:30 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>kannst du die exception denn mit try {} catch(...) {} fangen?<br />
Evtentuell wird eine Exception vom Typ boost::error_already_set geworfen? Wenn ja, kannst du danach mit PyErr_Print (oder so ähnlich) den Fehler ausgeben.</p>
</blockquote>
<p>Also ich hab schon versucht die Exceptions zu fangen, bis jetzt aber ohne Erfolg. Dazu hab ich den Update() Aufruf vom Subject aus mit try catch( ... ) eingeschlossen und auch im Listener selbst in die Update Methode try catch benutzt. Beides hat leider nicht geklappt. Wenn ich nur wüsste, wo die Exception fliegt.<br />
Hier übrigens die Fehlerbehandlung mit PyErr_Print:</p>
<pre><code class="language-cpp">if ( boost::python::handle_exception( boost::bind(exec_file_test, sFile) ) )
    {
        if (PyErr_Occurred())
        {
            wxLogError( wxT(&quot;Fehler aufgetreten:&quot;) );
            PyErr_Print();
            boost::python::object sys(boost::python::handle&lt;&gt;(PyImport_ImportModule(&quot;sys&quot;)));
            boost::python::object err = sys.attr(&quot;stderr&quot;);
            std::string err_text = boost::python::extract&lt;std::string&gt;(err.attr(&quot;getvalue&quot;)());
            wxLogMessage(err_text.c_str());
        }
        else
        {
            wxLogError(&quot;A C++ exception was thrown  for which &quot;
                        &quot;there was no exception translator registered.&quot;);
        }
    }
</code></pre>
<p>Das dunktioniert soweit, sprich ich kann mir die Python Fehlermeldungen im Programm ausgeben lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619990</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Mon, 24 Nov 2008 15:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 24 Nov 2008 20:12:36 GMT]]></title><description><![CDATA[<p>So, ich konnte den Ursprung der Exception nun genau bestimmen:</p>
<pre><code class="language-cpp">struct Listener : Observer, boost::python::wrapper&lt;Observer&gt;
{
    [...]

    virtual void Update(Subject* s)
    {
        this-&gt;get_override(&quot;Update&quot;)(s); //&lt;-- Hier wird die Exception geworfen
    }
    [...]
};
</code></pre>
<p>Das blöde ist nur, dass selbst wenn ich die Exceptionbehandlung hinzufüge, kann ich die Ausnahme nicht auffangen:</p>
<pre><code class="language-cpp">struct Listener : Observer, boost::python::wrapper&lt;Observer&gt;
{
    [...]

 virtual void Update(Subject* s)
    {
        try
        {
        this-&gt;get_override(&quot;Update&quot;)(s);
        }
        catch( ... )
        {
            wxMessageBox(&quot;Fehler&quot;);
        }
    }
    [...]
};
</code></pre>
<p>Ich bin ehrlich gesagt überfragt, was ich an der Stelle falsch mache. SCheinbar ist der Aufruf von this-&gt;get_override(&quot;Update&quot;)(s); falsch, aber ich weiß nicht wie es denn richtig aussehen müsste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620159</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Mon, 24 Nov 2008 20:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 24 Nov 2008 20:41:30 GMT]]></title><description><![CDATA[<p>versuch ma noch das hier, dann kannst du es noch weiter eingrenzen:</p>
<pre><code class="language-cpp">void Update(Subject* s)
{
	if(override f = get_override(&quot;Update&quot;))
		f(s);
// oder auch eventuell f(boost::ref(s));
	else
		Listener::Update(s);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1620171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620171</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Mon, 24 Nov 2008 20:41:30 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Tue, 25 Nov 2008 17:41:23 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>versuch ma noch das hier, dann kannst du es noch weiter eingrenzen:</p>
<pre><code class="language-cpp">void Update(Subject* s)
{
	if(override f = get_override(&quot;Update&quot;))
		f(s);
// oder auch eventuell f(boost::ref(s));
	else
		Listener::Update(s);
}
</code></pre>
</blockquote>
<p>Also vielen Dank für den Tipp, aber sobald f(s) oder f(boost::ref(s)); aufgerufen werden fliegt die Exception. Aber immerhin funktioniert scheinbar die get_override() Funktion. Fangen kann ich sie aber wiedermal nicht.<br />
Die Frage die ich mir gerade stelle ist, ob das denn dann überhaupt eine Exception ist.<br />
Die Nachrichti die ich bekomme lautet zumindest wie folgt:</p>
<blockquote>
<p>Runtime Error!<br />
Program: blabla.exe<br />
This application has requested the runtime to terminate it in an unusual way. Please Contact the application's support team for more information.</p>
</blockquote>
<p>Ich mein, das ist doch eine Nachricht einer nicht gefangenen Exception oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620643</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Tue, 25 Nov 2008 17:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Tue, 25 Nov 2008 20:12:28 GMT]]></title><description><![CDATA[<p>Gate schrieb:</p>
<blockquote>
<p>Ich mein, das ist doch eine Nachricht einer nicht gefangenen Exception oder?</p>
</blockquote>
<p>Nicht zwingend. Führ das Programm mal im Debug-Modus aus, dann solltest du mehr Informationen darüber bekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1620753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1620753</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 25 Nov 2008 20:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Wed, 26 Nov 2008 20:25:28 GMT]]></title><description><![CDATA[<p>So endlich,<br />
ich hab nun herausgefunden, warum die Exception fliegt.<br />
Die Übergabe von Paramtern vom C++ Programm zu Python funktioniert nicht.<br />
Eigentlich hatte die Python Updatemethode ja einmal den self und dann den Subject Paramter. Mittels</p>
<pre><code class="language-cpp">this-&gt;get_override(&quot;Update&quot;)(s);
</code></pre>
<p>wollte ich das Subject an die Methode übergeben. Irgendwie funktioniert das nicht. Wenn ich also im pythonskript der Updatemethode nur noch den self paramter definiere und dann vom Programm aus</p>
<pre><code class="language-cpp">this-&gt;get_override(&quot;Update&quot;)();
</code></pre>
<p>aufrufe geht es ohne exception.<br />
Hat nun vllt. jemand ne Idee wie ich es hinbekomme doch noch den Subject Parameter zu übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1621419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1621419</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Wed, 26 Nov 2008 20:25:28 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Wed, 26 Nov 2008 21:56:12 GMT]]></title><description><![CDATA[<p>was passiert, wenn du das machst:</p>
<pre><code class="language-cpp">Subject* s = ...; // als parameter oder sonstwas.

boost::python::object o(s)
this-&gt;get_override(&quot;Update&quot;)(o);
</code></pre>
<p>So kommst du weiter in den Fehler rein, wenn die Exception in der Zeile mit python::object fliegt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1621473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1621473</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Wed, 26 Nov 2008 21:56:12 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Sun, 30 Nov 2008 12:47:56 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>was passiert, wenn du das machst:</p>
<pre><code class="language-cpp">Subject* s = ...; // als parameter oder sonstwas.

boost::python::object o(s)
this-&gt;get_override(&quot;Update&quot;)(o);
</code></pre>
<p>So kommst du weiter in den Fehler rein, wenn die Exception in der Zeile mit python::object fliegt</p>
</blockquote>
<p>Ah, das ist interessant, die Exception oder was auch immer, ich nenns jetzt mal Runtime Error, fligt beim Aufruf von</p>
<pre><code class="language-cpp">boost::python::object o(s)
</code></pre>
<p>Also tippe ich mal, dass die Konvertierung vom Subject zu einem Pythonbjekt fehlschlägt. Liege ich damit soweit richtig? und wichtiger, was kann ich tun damit es klappt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623278</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623278</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Sun, 30 Nov 2008 12:47:56 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Sun, 30 Nov 2008 19:29:20 GMT]]></title><description><![CDATA[<p>Ja, scheint so, als ob Subject* nicht an python übergeben werden kann.<br />
zeig doch mal deine deklaration von Subject und wie du das in boost.python registrierst.<br />
Und probiere mal boost::python::object(boost::ref(s))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623482</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 30 Nov 2008 19:29:20 GMT</pubDate></item><item><title><![CDATA[Reply to Boost.preprocessor String-Vergleich on Mon, 01 Dec 2008 17:27:56 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>Und probiere mal boost::python::object(boost::ref(s))</p>
</blockquote>
<p>Hey, vielen Dank. Das hat nun endlich geklappt. Allerdings bleibt nun meine Frage, aufgrund derer ich überhaupt den Thread wieder hochgeholt habe:<br />
Gibt es eine Möglichkeit das Slicing zu verhindern?<br />
Als Beispiel:</p>
<pre><code>class CSVExporter(LoW.Listener):
        def Update(self,Subject):
            l = [&quot;Ja&quot;, &quot;Nein&quot;]
            Choice = LoW.Choice(&quot;Sollen die Fachdaten als CSV Datei exportiert werden?&quot;,l)
            if Choice == &quot;Ja&quot;:
                DoIt()

        def DoIt():
            [...]
</code></pre>
<p>Sobald hier nun innerhalb der Update Methode DoIt() aufgerufen wird, gibt es den gleichen Runtime Error wie schon zuvor.<br />
Das dürfte ja daran liegen, dass im Programm selbst nur Listener gespeichert werden können, die aber eben keine weitere Methoden wie eben z.B. DoIt definiert haben. Ein typisches Slicing Problem. Also hat damit vllt. jemand Erfahrungen und Ideen wie ich den Fehler umgehen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1623904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1623904</guid><dc:creator><![CDATA[Gate]]></dc:creator><pubDate>Mon, 01 Dec 2008 17:27:56 GMT</pubDate></item></channel></rss>