<?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[const get und get nur ein mal implementieren]]></title><description><![CDATA[<p>Welches ist die beste Möglichkeit die Funktionen get() const; und get(); zusammen zu implementieren, damit ich nicht in zwei Funktionen den gleichen Quellencode schreiben muss?</p>
<p>Ich habe mir überlegt eine private Funktion zu schreiben und sie in beiden nur noch aufzurufen. Eine andere Idee ist die get() const; in get(); aufzurufen, aber hier weiß ich nicht wie ich dem Compiler sagen kann dass es sich hier nicht um seine eigene Funktion handelt, damit würde das Programm in einer Endlosschleife landen. Oder habt ihr noch eine bessere Möglichkeit ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326894/const-get-und-get-nur-ein-mal-implementieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 25 May 2026 12:32:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326894.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Jul 2014 11:15:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 11:15:29 GMT]]></title><description><![CDATA[<p>Welches ist die beste Möglichkeit die Funktionen get() const; und get(); zusammen zu implementieren, damit ich nicht in zwei Funktionen den gleichen Quellencode schreiben muss?</p>
<p>Ich habe mir überlegt eine private Funktion zu schreiben und sie in beiden nur noch aufzurufen. Eine andere Idee ist die get() const; in get(); aufzurufen, aber hier weiß ich nicht wie ich dem Compiler sagen kann dass es sich hier nicht um seine eigene Funktion handelt, damit würde das Programm in einer Endlosschleife landen. Oder habt ihr noch eine bessere Möglichkeit ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408373</guid><dc:creator><![CDATA[cppvoid]]></dc:creator><pubDate>Sun, 13 Jul 2014 11:15:29 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 11:25:24 GMT]]></title><description><![CDATA[<p>Du musst eben das const explizit dazucasten und danach wieder wegcasten. Koennte man vermutlich in einem Makro verpacken.</p>
<pre><code>struct X
{
    T const&amp; x() const { return x_; }
    T&amp;       x()       { return const_cast&lt;T&amp;&gt;(static_cast&lt;X const*&gt;(this)-&gt;x()); }

private:
    T x_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2408374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408374</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 13 Jul 2014 11:25:24 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 12:18:32 GMT]]></title><description><![CDATA[<p>Oder wie folgt mit nur einem Cast:</p>
<pre><code>struct X
{
    T const&amp; x() const { return const_cast&lt;X*&gt;(this)-&gt;x(); }
    T&amp;       x()       { return x_; }

private:
    T x_;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2408376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408376</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 13 Jul 2014 12:18:32 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 13:41:23 GMT]]></title><description><![CDATA[<p>Das kann man in ein Makro packen:</p>
<pre><code>#include &lt;type_traits&gt;

template &lt;typename T&gt;
struct add_inner_const
{
    using type = typename std::remove_pointer&lt;T&gt;::type const*;
};

template &lt;typename T&gt;
using add_inner_const_t = typename add_inner_const&lt;T&gt;::type;

#define CALL_CONST(...) const_cast&lt;decltype((this-&gt;__VA_ARGS__))&gt; \
    (const_cast&lt;add_inner_const_t&lt;decltype(this)&gt;&gt;(this)-&gt; __VA_ARGS__)

struct X
{
    struct T {};

    X() {}

private:
    T x_;

public:

    T const&amp; x() const {return x_;}
    T&amp; x() {return CALL_CONST(x());}
};

int main()
{
    X o;
    X const oc;
    o.x();
    oc.x();
}
</code></pre>
<p>P.S.:</p>
<pre><code>auto x() const -&gt; decltype((x_)) {return x_;}
	auto x()       -&gt; decltype((x_)) {return x_;}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Edit:</p>
<blockquote>
<p>Oder wie folgt mit nur einem Cast:</p>
</blockquote>
<p>Nein, das ist falsch (und wird ggf. zu undefiniertem Verhalten führen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408377</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 13 Jul 2014 13:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 12:36:17 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Oder wie folgt mit nur einem Cast:</p>
</blockquote>
<p>Nein, das ist falsch (und wird ggf. zu undefiniertem Verhalten führen).</p>
</blockquote>
<p>Mann muss natürlich annehmen, dass im non-const <code>x()</code> das Objekt nicht verändert wird. Wenn diese Annahme stimmt sollte es kein UB geben oder liege ich da falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408378</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Sun, 13 Jul 2014 12:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 12:48:06 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn diese Annahme stimmt sollte es kein UB geben oder liege ich da falsch?</p>
</blockquote>
<p>Richtig.</p>
<p>Bekomme ich aber einen Compiler-Fehler wenn ich aus Versehen im non-const <code>x()</code> ein Objekt verändere, oder eine non-const Memberfunktion aufrufe die ersteres tut?</p>
<p>Oder derartiges nachträglich ergänze, möglicherweise sogar nicht als Erstprogrammierer der es vergessen hat, sondern als Zweitprogrammierer der von der <code>const</code> -Memberfunktion gar nichts weiß?</p>
<p>Natürlich nicht. Daher ist dein Ansatz ziemlich frickelig. Bedenke folgendes: Es geht hier wahrscheinlich nicht um getter wie <code>x</code> , sondern komplexere Funktionen. Sonst könnte man doch das <code>return</code> -Statement kopieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408379</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 13 Jul 2014 12:48:06 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 13:27:22 GMT]]></title><description><![CDATA[<p>Dass Getter-Funktionen das Objekt direkt beim Aufruf ändern, ist doch relativ unüblich. Wenn, dann höchstens für Caching, und dann arbeitet man wieder mit <code>mutable</code> -Membern, die man auch in der Const-Memberfunktion ändern darf. Aber stimmt schon, generell ist es gut das sicher zu gestalten.</p>
<p>Das Makro geht doch sicher einfacher, ohne <code>&lt;type_traits&gt;</code> -Header?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408382</guid><dc:creator><![CDATA[Nachfrager]]></dc:creator><pubDate>Sun, 13 Jul 2014 13:27:22 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Sun, 13 Jul 2014 13:46:32 GMT]]></title><description><![CDATA[<p>Den unsinnigen Code schnell korrigiert - Soll natürlich ein inneres <code>const</code> <strong>hinzufügen</strong>, nicht entfernen. Das Finalfieber...</p>
<blockquote>
<p>Dass Getter-Funktionen das Objekt direkt beim Aufruf ändern, ist doch relativ unüblich.</p>
</blockquote>
<p>Warum auf Getter beschränken?</p>
<p>Nachfrager schrieb:</p>
<blockquote>
<p>Das Makro geht doch sicher einfacher, ohne <code>&lt;type_traits&gt;</code> -Header?</p>
</blockquote>
<p>Klar - du kannst (und solltest vielleicht) <code>add_inner_const</code> so umschreiben:</p>
<pre><code>template &lt;typename T&gt; struct add_inner_const;
template &lt;typename U&gt; struct add_inner_const&lt;U*&gt;
{ using type = U const*; };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2408383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408383</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 13 Jul 2014 13:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to const get und get nur ein mal implementieren on Mon, 14 Jul 2014 06:26:04 GMT]]></title><description><![CDATA[<p>Man kann natürlich anders herum gehen:</p>
<pre><code>#define DEFINE_PAIR( rtype, trailing, decl, ... )   \
	rtype trailing decl {__VA_ARGS__}             \
	rtype const trailing decl const {__VA_ARGS__}

struct X
{
	struct T {};

	X() {}

private:
	T x_;

public:

	DEFINE_PAIR( T, &amp;, x(), return x_; )
};

#include &lt;type_traits&gt; // Lediglich zu Testzwecken

int main()
{
	X o;
	X const oc;
	o.x();
	oc.x();
	static_assert( std::is_same&lt;decltype((o .x())), X::T      &amp;&gt;::value, &quot;&quot; );
	static_assert( std::is_same&lt;decltype((oc.x())), X::T const&amp;&gt;::value, &quot;&quot; );
}
</code></pre>
<p>Damit werden zwei Memberfunktionen definiert die sich lediglich im Rückgabetyp und im <code>const</code> -qualifier unterscheiden.<br />
Lässt sich dann zu</p>
<pre><code>#define DEFINE_GETTER_PAIR( rtype, trailing, decl, ... )      \
	rtype trailing decl {return (__VA_ARGS__);}                       \
	rtype const trailing decl const {return (__VA_ARGS__);}
</code></pre>
<p>erweitern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2408392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2408392</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 14 Jul 2014 06:26:04 GMT</pubDate></item></channel></rss>