<?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::bind mit rvalue-Referenz]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>kann man boost-bind mit rvalue-Referenzen nutzen?<br />
Also ich möchte in folgendem Beispiel aus der Referenz eine rvalue-Referenzen machen.</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;iostream&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;

class Foo{};

void foobar(Foo&amp; foo){
        std::cout &lt;&lt; &quot;foobar&quot; &lt;&lt; std::endl;
};

int main(){
        Foo foo;
        boost::function&lt;void ()&gt; f(boost::bind(&amp;foobar, boost::ref(foo)));
        f();
}
</code></pre>
<p>Ist es möglich?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287557/boost-bind-mit-rvalue-referenz</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 08:44:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287557.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 30 May 2011 23:18:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Mon, 30 May 2011 23:18:50 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>kann man boost-bind mit rvalue-Referenzen nutzen?<br />
Also ich möchte in folgendem Beispiel aus der Referenz eine rvalue-Referenzen machen.</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;iostream&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;

class Foo{};

void foobar(Foo&amp; foo){
        std::cout &lt;&lt; &quot;foobar&quot; &lt;&lt; std::endl;
};

int main(){
        Foo foo;
        boost::function&lt;void ()&gt; f(boost::bind(&amp;foobar, boost::ref(foo)));
        f();
}
</code></pre>
<p>Ist es möglich?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071234</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Mon, 30 May 2011 23:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Tue, 31 May 2011 06:27:44 GMT]]></title><description><![CDATA[<p>Schon ausprobiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071257</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 31 May 2011 06:27:44 GMT</pubDate></item><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Tue, 31 May 2011 07:26:09 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>kann man boost-bind mit rvalue-Referenzen nutzen?<br />
Also ich möchte in folgendem Beispiel aus der Referenz eine rvalue-Referenzen machen.</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;iostream&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;

class Foo{};

void foobar(Foo&amp; foo){
        std::cout &lt;&lt; &quot;foobar&quot; &lt;&lt; std::endl;
};

int main(){
        Foo foo;
        boost::function&lt;void ()&gt; f(boost::bind(&amp;foobar, boost::ref(foo)));
        f();
}
</code></pre>
<p>Ist es möglich?</p>
</blockquote>
<p>Ist <em>was</em> möglich? Geht das ein bisschen genauer?</p>
<p>Ich rate mal: Die Funktion foobar soll eine Rvalue-Referenz entgegennehmen.</p>
<p>Gegenfrage: Was soll das?</p>
<p>Zu bind: Die gebundenen Objekte werden immer als Lvalue-Ausdruck weitergeleitet. Das ist auch gut so, da man sonst ungewollte Mutationen bzgl der gebundenen Objekte stattfinden könnten.</p>
<p>Lambdas können helfen:</p>
<pre><code class="language-cpp">class Foo{};

void foobar(Foo&amp;&amp; foo){
        std::cout &lt;&lt; &quot;foobar&quot; &lt;&lt; std::endl;
};

int main(){
        Foo foo;
        boost::function&lt;void ()&gt; f = [&amp;foo]{foobar(std::move(foo));};
        f();
}
</code></pre>
<p>Da die Funktion foobar eine Rvalue-Referenz entgegen nimmt und diese Art Referenz sich die immer nur auf Objekte bezieht, die verändert werden dürfen, ohne dass es jemanden stören würde, darf foobar hier das Foo-Objekt verändern. Das musst Du bedenken, wenn Du f mehrmals aufrufen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071280</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 31 May 2011 07:26:09 GMT</pubDate></item><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Tue, 31 May 2011 08:46:43 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Schon ausprobiert?</p>
</blockquote>
<p>Jupp...</p>
<pre><code class="language-cpp">void foobar(Foo&amp;&amp; foo){
        std::cout &lt;&lt; &quot;foobar&quot; &lt;&lt; std::endl;
};
</code></pre>
<p>Ich hab es so probiert:</p>
<pre><code class="language-cpp">boost::function&lt;void ()&gt; f(boost::bind(&amp;foobar, foo));
</code></pre>
<p>und</p>
<pre><code class="language-cpp">boost::function&lt;void ()&gt; f(boost::bind(&amp;foobar, boost::bind(&amp;std::move, foo)));
</code></pre>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Gegenfrage: Was soll das?</p>
</blockquote>
<p>Ich hab eine Member-Funktion mit einer rvalue-Referenz.<br />
Diese Member-Funktion soll der Einstiegspunkt für einen neuen Thread sein.<br />
Sie wird folglich nur einmal aufgerufen. (Das hatte ich schon bedacht und erst vermutet, dass es deswegen evtl. nicht geht)</p>
<p>Jetzt möchte ich an boost::thread ein boost::bind übergeben. Also eigentlich<br />
später für eine Member-Funktion. Ich wollte das Beispiel nur einfach halten.</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071315</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 31 May 2011 08:46:43 GMT</pubDate></item><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Tue, 31 May 2011 09:47:38 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich hab eine Member-Funktion mit einer rvalue-Referenz.</p>
</blockquote>
<p>Warum? Das klingt alles sehr komisch!</p>
<p>Werd doch mal konkreter. Zeig doch mal ein repräsentatives Beispiel. Was für eine Memberfunktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2071344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071344</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 31 May 2011 09:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Tue, 31 May 2011 16:08:33 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<blockquote>
<p>Ich hab eine Member-Funktion mit einer rvalue-Referenz.</p>
</blockquote>
<p>Warum? Das klingt alles sehr komisch!</p>
<p>Werd doch mal konkreter. Zeig doch mal ein repräsentatives Beispiel. Was für eine Memberfunktion?</p>
</blockquote>
<p>Naja... Dann pack ich mal einiges an Source-Code aus...<br />
Ich hoffe danach verstehst du, warum ich das mache bzw. ich, warum ich was anders machen sollte...</p>
<pre><code class="language-cpp">#include &lt;memory&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;boost/bind.hpp&gt;
#include &lt;boost/function.hpp&gt;
#include &lt;boost/asio.hpp&gt;

class Request /* vereinfachte Klasse */{
public:
	void add_info(std::vector&lt;char&gt;&amp; vector, unsigned int i){}
	bool is_complete(){
		return true;
	}
};

class SocketConnection;

class RequestHandler{
public:
	virtual ~RequestHandler(){}
	virtual void handle_request(std::unique_ptr&lt;SocketConnection&gt;&amp;&amp; connection) = 0;
};

class RequestHandlerImpl : public RequestHandler{
public:
	virtual void handle_request(std::unique_ptr&lt;SocketConnection&gt;&amp;&amp; connection){
		std::cout &lt;&lt; &quot;handle_request&quot; &lt;&lt; std::endl;
	}
};

class SocketConnection{
public:
	typedef boost::asio::buffered_write_stream&lt;boost::asio::ip::tcp::socket&gt; stream_buffer_type;
	SocketConnection(boost::asio::io_service&amp; service) : _data(4096), _stream_buffer(service), _socket(_stream_buffer.next_layer()) {}

	std::vector&lt;char&gt; _data;
	stream_buffer_type _stream_buffer;
	boost::asio::ip::tcp::socket&amp; _socket;
	Request _request;
};

class Server{
public:
	// ###TODO### Fix memory leak for created SocketConnection, when Server is stopped

	Server(unsigned int port) : _io_service(), _acceptor(_io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)){}	

	void read(SocketConnection&amp; socket_connection){
		std::cout &lt;&lt; &quot;read()&quot; &lt;&lt; std::endl;
		socket_connection._socket.async_read_some(boost::asio::buffer(socket_connection._data), boost::bind(&amp;Server::handle_async_read, this, boost::ref(socket_connection), boost::asio::placeholders::error, _2));
	}

	void handle_async_read(SocketConnection&amp; socket_connection, const boost::system::error_code&amp; error, std::size_t bytes_transferred){
		std::cout &lt;&lt; &quot;handle_async_read()&quot; &lt;&lt; std::endl;
		try{
			if(error){
				throw std::string(&quot;Error while reading socket&quot;);
			}
			socket_connection._request.add_info(socket_connection._data, bytes_transferred);
			if(socket_connection._request.is_complete()){
				RequestHandler* handler = /* find_request_handler(_request)*/ new RequestHandlerImpl(); /* Nur wegen Vereinfachung ein Memory-Leak */
				handler-&gt;handle_request(std::move(std::unique_ptr&lt;SocketConnection&gt;(&amp;socket_connection))); // &lt;-- HIER: Neun Thread starten, allerdings ist socket_connection nicht copyable, wegen boost::asio::ip::tcp::socket
			}	

		}
		catch (...) {
			delete &amp;socket_connection; // ###TODO### check, if the object can be destroyed
			throw; // ###TODO### Fliegt noch bis unten durch
		}
	}

	void handle_accept(SocketConnection&amp; socket_connection, const boost::system::error_code&amp; error){
		std::cout &lt;&lt; &quot;handle_accept()&quot; &lt;&lt; std::endl;
		SocketConnection* new_socket = new SocketConnection(_io_service);
		read(socket_connection);
		_acceptor.async_accept(new_socket-&gt;_socket, boost::bind(&amp;Server::handle_accept, this, boost::ref(*new_socket), boost::asio::placeholders::error));
	}

	void start(){
		std::cout &lt;&lt; &quot;start()&quot; &lt;&lt; std::endl;
		SocketConnection* socket_connection = new SocketConnection(_io_service);
		_acceptor.async_accept(socket_connection-&gt;_socket, boost::bind(&amp;Server::handle_accept, this, boost::ref(*socket_connection), boost::asio::placeholders::error));
		_io_service.run();
	}

	boost::asio::io_service _io_service;
	boost::asio::ip::tcp::acceptor _acceptor;
};

int main(){
	Server server(3820);
	server.start();
	while(true); // Natürlich nur wegen Vereinfachung
}
</code></pre>
<p>Gruß,<br />
XSpille</p>
<p>EDIT:<br />
Diese Zeile hat mich dazu gebracht einen boost::shared_ptr zu verwenden, obwohl ich eigentlich ein Gegner davon, da er zu oft verwendet wird, obwohl er nicht (zwangsläufig) notwendig ist.<br />
Ich glaube inzwischen hier ist er jedoch ratsam...</p>
<pre><code class="language-cpp">// ###TODO### Fix memory leak for created SocketConnection, when Server is stopped
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2071525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2071525</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 31 May 2011 16:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Wed, 01 Jun 2011 14:19:11 GMT]]></title><description><![CDATA[<p>Auweia! Das ist ja ein ganz schönes Durcheinander da.</p>
<p>Hier mal ein <code>new</code> . Das erzeugte Objekt per Referenz weitergeben. Wieder einen Zeiger holen und den Besitz zwischenzeitlich an ein <em>temporäres</em> unique_ptr-Objekt übergeben (welcher es dann auch zerstört) und dann später nochmal über die Referenze deleten.</p>
<p>Das Design ist nicht wirklich gut durchdacht bzgl Besitzverhältnisse und das mit den Rvalue-Referenzen und dem std::move hat da auch nichts zu suchen.</p>
<p>Sowas wie</p>
<pre><code class="language-cpp">try {
  blah
} catch (...) {
  delete soundwo;
  throw
}
</code></pre>
<p>ist schonmal ein Antipattern. Dafür gibt es ja Dinge wie unique_ptr.</p>
<p>Versuch Dir Objekt-Besitzverhältnisse als Wald aus Bäumen oder zumindest gerichteten Graphen vorzustellen, wobei die Wurzeln immer irgendwo im Stack liegen. Wenn Du das so organisierst und einem per new Erzeugten Objekt sofort einem anderen Besitzer zuordnest, dann kann eigentlich nicht viel schief gehen. Da Du schon C++0x Mittel verwendest, kannst Du ja std::unique_ptr verwenden, um bei Funktionsaufrufen den Besitz zu übergeben (das ist dann auch selbstdokumentierend) oder eben als roher Zeiger, wobei ich einen rohen Zeiger immer nur dann nehmen würde, wenn der Besitz <em>nicht</em> weitergegeben wird, sondern der Zeiger nur &quot;verliehen&quot; wird.</p>
<p>Was meine ich mit Besitz? Nun, Grundprizip von RAII ist es, die Verantwortung für Recourcen-Verwaltung an Objekte abzugeben. Das macht vieles einfacher. Und das wird dann oft &quot;Besitz&quot; genannt. Beispiel: Ein vector&lt;double&gt; &quot;besitzt&quot; alle seine double-Objekte. Ein unique_ptr &quot;besitzt&quot; das Objekt, auf das er zeigt. Solange klar ist, wer wofür zuständig ist, ist alles gut. Wenn alle Objekte, die nicht im automatischen Speicherbereich (Stack) leben, einen solchen Besitzer haben, muss man sich auch nicht mehr überlegen, wann wo was manuell gelöscht werden soll.</p>
<p>Habe ich schon das Zauberwort RAII verwendet? <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>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072010</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 01 Jun 2011 14:19:11 GMT</pubDate></item><item><title><![CDATA[Reply to boost::bind mit rvalue-Referenz on Wed, 01 Jun 2011 17:32:03 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Auweia! Das ist ja ein ganz schönes Durcheinander da.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Hier mal ein <code>new</code> . Das erzeugte Objekt per Referenz weitergeben.</p>
</blockquote>
<p>Was spricht dagegen? Das Objekt gehört die ganze Zeit dem Server, bis er den Besitz deutlich durch std::unique_ptr abgibt.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wieder einen Zeiger holen und den Besitz zwischenzeitlich an ein <em>temporäres</em> unique_ptr-Objekt übergeben (welcher es dann auch zerstört)</p>
</blockquote>
<p>Genau hier wird der Besitz abgegeben...</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>und dann später nochmal über die Referenze deleten.</p>
</blockquote>
<p>Das delete wird nur bei einer Exception aufgerufen. Wenn die Behandlung des Request in einem anderen Thread abläuft, kann ein Doppel-delete nicht auftreten.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das Design ist nicht wirklich gut durchdacht bzgl Besitzverhältnisse</p>
</blockquote>
<p>Ich habe nur zweimal new in meinem Code. Wozu gehört denn die SocketConnection?<br />
Bei mir ist der Server solange verantwortlich, bis er sie mit std::unique_ptr explizit weitergibt. In meinem nicht reduzierten Code habe ich noch eine Liste mit allen SocketConnections.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>und das mit den Rvalue-Referenzen und dem std::move hat da auch nichts zu suchen.</p>
<p>Sowas wie</p>
<pre><code class="language-cpp">try {
  blah
} catch (...) {
  delete soundwo;
  throw
}
</code></pre>
<p>ist schonmal ein Antipattern. Dafür gibt es ja Dinge wie unique_ptr.</p>
</blockquote>
<p>Wenn ich nen neuen Thread starte, der damit arbeitet, wie ich vor habe, zieh ich mir das Objekt unterm hintern weg... Wenn der Request noch nicht vollständig ist, wird die Funktion ja nochmal asynchron aufgerufen. Folglich auch dann kann ich es nicht löschen.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Da Du schon C++0x Mittel verwendest, kannst Du ja std::unique_ptr verwenden, um bei Funktionsaufrufen den Besitz zu übergeben (das ist dann auch selbstdokumentierend) oder eben als roher Zeiger, wobei ich einen rohen Zeiger immer nur dann nehmen würde, wenn der Besitz <em>nicht</em> weitergegeben wird, sondern der Zeiger nur &quot;verliehen&quot; wird.</p>
</blockquote>
<p>Genauso habe ich es vor...</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Habe ich schon das Zauberwort RAII verwendet? <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>
</blockquote>
<p>Ich versuche immer nach RAII zu proggn... Wie gesagt... Ich habe versucht den Code zu reduzieren und meine Liste mit SocketConnections wegreduziert.</p>
<p>Und wenn ich nen neuen Thread starte muss ich den Besitz ja übergeben (oder kopieren), oder?</p>
<p>DANKE,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072136</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Wed, 01 Jun 2011 17:32:03 GMT</pubDate></item></channel></rss>