<?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[mit Templateargument Methoden &amp;quot;entfernen&amp;quot;?]]></title><description><![CDATA[<p>Ich habe folgendes Szenario / Idee</p>
<pre><code>template &lt;/*...*/&gt;
class X {
    void read(/*...*/) { /*...*/ }
    void write(/*...*/) { /*...*/ }
}
</code></pre>
<p>Ich würde gerne, mittels eines Templatearguments, nur schreiben, lesen oder beides.<br />
Kann ich dem Compiler dazu bringen mir dann auch einen Fehler zu werfen, bei falscher Benutzung?<br />
sozusagen ein ios_base::openmode zur Kompilierzeit.<br />
Geht das überhaupt? Wenn nicht, was gäb es für gute Alternativen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312088/mit-templateargument-methoden-quot-entfernen-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 08:26:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312088.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Dec 2012 16:35:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 16:35:36 GMT]]></title><description><![CDATA[<p>Ich habe folgendes Szenario / Idee</p>
<pre><code>template &lt;/*...*/&gt;
class X {
    void read(/*...*/) { /*...*/ }
    void write(/*...*/) { /*...*/ }
}
</code></pre>
<p>Ich würde gerne, mittels eines Templatearguments, nur schreiben, lesen oder beides.<br />
Kann ich dem Compiler dazu bringen mir dann auch einen Fehler zu werfen, bei falscher Benutzung?<br />
sozusagen ein ios_base::openmode zur Kompilierzeit.<br />
Geht das überhaupt? Wenn nicht, was gäb es für gute Alternativen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282710</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sun, 23 Dec 2012 16:35:36 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 16:44:09 GMT]]></title><description><![CDATA[<p>spezialisieren?</p>
<pre><code>enum class openmode
{
    read,
    write
};

template &lt;openmode&gt;
class X 
{
};

template&lt;&gt;
class X&lt;openmode::read&gt;
{
    void read(/*...*/) { /*...*/ }
};

template&lt;&gt;
class X&lt;openmode::write&gt;
{
    void write(/*...*/) { /*...*/ }
};
</code></pre>
<p>(Ungetestet, C++11)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282713</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 16:44:09 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Mon, 24 Dec 2012 13:30:23 GMT]]></title><description><![CDATA[<pre><code>#include &lt;type_traits&gt;

struct Reader
{
    void read();
};

struct Writer
{
    void write();
};

struct Empty {};

template &lt;bool R, bool W&gt;
struct X
    : public typename std::conditional&lt;R, Reader, Empty&gt;::type
    , public typename std::conditional&lt;W, Writer, Empty&gt;::type
{
};
</code></pre>
<p>Statt <code>bool</code> könntest du natürlich auch Flags nehmen.</p>
<p><em>[Edit] <code>::type</code> vergessen</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282716</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 24 Dec 2012 13:30:23 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 17:02:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Du hast ::type vergessen &quot;std::conditional&lt;R, Reader, Empty&gt;::type&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282728</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sun, 23 Dec 2012 17:02:56 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 17:10:45 GMT]]></title><description><![CDATA[<blockquote>
<p>oder beides.</p>
</blockquote>
<p>Hab ich übersehen. :xmas1:</p>
<p>Passe meine Lösung an.</p>
<p>Edit: Nimm gleich Nexus', meine läuft auch nur aufs ableiten hinaus..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282730</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 17:10:45 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 17:39:20 GMT]]></title><description><![CDATA[<p>Oder Alternativ:</p>
<pre><code>struct Reader 
{ 
    void read(); 
}; 

struct Writer 
{ 
    void write(); 
};   

template &lt;tyename... StreamPolicies&gt; 
struct X : public StreamPolicies... 
{ 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2282736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282736</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 23 Dec 2012 17:39:20 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 17:44:42 GMT]]></title><description><![CDATA[<p>Ganz anderer Ansatz:</p>
<pre><code>template &lt;OpenMode OM&gt;
struct X
{ 
  typename std::enable_if&lt;OM &amp; Read&gt;::type read();
  typename std::enable_if&lt;OM &amp; Write&gt;::type write();

  bool is_open() const;
};
</code></pre>
<p>Hat den Vorteil, dass manche Methoden von beiden benutzt werden können (is_open).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282740</guid><dc:creator><![CDATA[enabler]]></dc:creator><pubDate>Sun, 23 Dec 2012 17:44:42 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 18:00:49 GMT]]></title><description><![CDATA[<p>enabler schrieb:</p>
<blockquote>
<p>Ganz anderer Ansatz:</p>
<pre><code>template &lt;OpenMode OM&gt;
struct X
{ 
  typename std::enable_if&lt;OM &amp; Read&gt;::type read();
  typename std::enable_if&lt;OM &amp; Write&gt;::type write();

  bool is_open() const;
};
</code></pre>
<p>Hat den Vorteil, dass manche Methoden von beiden benutzt werden können (is_open).</p>
</blockquote>
<p>Das wird nicht funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282748</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 18:00:49 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 18:09:20 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Das wird nicht funktionieren.</p>
</blockquote>
<p>Stimmt, da braucht es etwas mehr Aufwand:</p>
<pre><code class="language-cpp">template &lt;bool R, bool W&gt;
struct X {
  template &lt;bool Enabled = R,
            typename = typename std::enable_if&lt;Enabled&gt;::type&gt;
  void read() {}
  template &lt;bool Enabled = W,
            typename = typename std::enable_if&lt;Enabled&gt;::type&gt;
  void write() {}
  bool is_open() const {};
};
</code></pre>
<p><a href="http://ideone.com/7PQh2D" rel="nofollow">Jetzt</a> geht es aber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282753</guid><dc:creator><![CDATA[enabler]]></dc:creator><pubDate>Sun, 23 Dec 2012 18:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 18:16:10 GMT]]></title><description><![CDATA[<p>Mir ist noch eine Möglichkeit eingefallen, die ohne Vererbung funktionieren könnte (aber nur wenn read und write keine Prozeduren, sondern Funktionen sind, was bei mir aber eh der Fall ist):</p>
<p>EDIT: Der Fehler ist aber nicht eindeutig / unverständlich</p>
<pre><code>struct wrong {
    virtual void _f() = 0;
};

template &lt;bool R, bool W&gt;
struct X 
{
    typename std::conditional&lt;R, int, wrong&gt;::type read() {
        /* ... */
        return 0;
    }

    typename std::conditional&lt;W, int, wrong&gt;::type write() {
        /* ... */
        return 0;
    }
};
</code></pre>
<p><strong>EDIT 2: Die Lösung von &quot;enabler&quot; ist sehr viel schöner.</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282755</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sun, 23 Dec 2012 18:16:10 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 18:17:37 GMT]]></title><description><![CDATA[<p>enabler schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Das wird nicht funktionieren.</p>
</blockquote>
<p>Stimmt, da braucht es etwas mehr Aufwand:</p>
<pre><code class="language-cpp">template &lt;bool R, bool W&gt;
struct X {
  template &lt;bool Enabled = R,
            typename = typename std::enable_if&lt;Enabled&gt;::type&gt;
  void read() {}
  template &lt;bool Enabled = W,
            typename = typename std::enable_if&lt;Enabled&gt;::type&gt;
  void write() {}
  bool is_open() const {};
};
</code></pre>
<p><a href="http://ideone.com/7PQh2D" rel="nofollow">Jetzt</a> geht es aber.</p>
</blockquote>
<p>Ja, aber das ganze mit SFINAE zu lösen ist irgendwie voll Overkill, findest du nicht?<br />
Ich finde Nexus' Lösung ist die beste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282757</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 18:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 18:38:43 GMT]]></title><description><![CDATA[<p>Zumindest müsste ich mit der Version von &quot;enabler&quot; nicht alles umbauen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282762</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Sun, 23 Dec 2012 18:38:43 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 18:43:34 GMT]]></title><description><![CDATA[<p>Was spricht gegen</p>
<pre><code class="language-cpp">template &lt;bool R, bool W&gt;
struct X {
  void read()
  {
      static_assert( R, &quot;read not enable for this type!&quot; );
      // ...
  }
  void write()
  {
      static_assert( W, &quot;write not enable for this type!&quot; );
      // ...
  }
  bool is_open() const {};
};
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282764</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 23 Dec 2012 18:43:34 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 21:28:45 GMT]]></title><description><![CDATA[<p>Ok, campers ist die Beste.</p>
<p>Ein einfaches <code>static_assert</code> dürfte es schon tun <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Bzw. Bei C++98/03 einfach <s>[c]BOOST_REQUIRE_MESSAGE[/c]</s> <code>BOOST_STATIC_ASSERT</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282767</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 21:28:45 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 19:56:26 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ok, campers ist die Beste.</p>
<p>Ein einfaches <code>static_assert</code> dürfte es schon tun <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Bzw. Bei C++98/03 einfach <code>BOOST_REQUIRE_MESSAGE</code> .</p>
</blockquote>
<p>Was soll <code>BOOST_REQUIRE_MESSAGE</code> in dem Zusammenhang? Das ist aus Boost.Test und macht einen RUNTIME Check. Also vollkommen daneben.</p>
<p>Wenn <code>static_assert</code> nicht verfügbar ist nimmt man einfach <code>BOOST_STATIC_ASSERT</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282797</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 23 Dec 2012 19:56:26 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 20:07:19 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Was spricht gegen [static_assert]?</p>
</blockquote>
<p>Das habe ich mir auch überlegt, war aber verunsichert, was den Auswertungszeitpunkt angeht.</p>
<p>Ist es also garantiert, dass <code>static_assert</code> erst angeschaut wird, wenn die entsprechende Methode instanziiert wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282805</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 23 Dec 2012 20:07:19 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 21:26:13 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ist es also garantiert, dass <code>static_assert</code> erst angeschaut wird, wenn die entsprechende Methode instanziiert wird?</p>
</blockquote>
<p>Nein. In diesem Falle ist aber die Bedingung vom Templateparameter abhängig und kann folglich erst bei der Instantiierung ausgewertet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282839</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 23 Dec 2012 21:26:13 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 21:28:06 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Ok, campers ist die Beste.</p>
<p>Ein einfaches <code>static_assert</code> dürfte es schon tun <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Bzw. Bei C++98/03 einfach <code>BOOST_REQUIRE_MESSAGE</code> .</p>
</blockquote>
<p>Was soll <code>BOOST_REQUIRE_MESSAGE</code> in dem Zusammenhang? Das ist aus Boost.Test und macht einen RUNTIME Check. Also vollkommen daneben.</p>
</blockquote>
<p>Ups.<br />
Hab es nur einige Sekunden vorher benutzt, deswegen die Verwechselung :xmas2:</p>
<p>Muss natürlich ~_STATIC_ASSERT sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282840</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 21:28:06 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 21:58:16 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ist es also garantiert, dass <code>static_assert</code> erst angeschaut wird, wenn die entsprechende Methode instanziiert wird?</p>
</blockquote>
<p>Nein. In diesem Falle ist aber die Bedingung vom Templateparameter abhängig und kann folglich erst bei der Instantiierung ausgewertet werden.</p>
</blockquote>
<p>aber die sind doch in dem Moment vorhanden wo die Klasse instanziiert wird. Und zum Beispiel der gcc versucht dann jede Funktion zu instanziieren, selbst wenn sie nicht aufgerufen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282855</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 23 Dec 2012 21:58:16 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 22:01:03 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ist es also garantiert, dass <code>static_assert</code> erst angeschaut wird, wenn die entsprechende Methode instanziiert wird?</p>
</blockquote>
<p>Nein. In diesem Falle ist aber die Bedingung vom Templateparameter abhängig und kann folglich erst bei der Instantiierung ausgewertet werden.</p>
</blockquote>
<p>aber die sind doch in dem Moment vorhanden wo die Klasse instanziiert wird. Und zum Beispiel der gcc versucht dann jede Funktion zu instanziieren, selbst wenn sie nicht aufgerufen wird.</p>
</blockquote>
<p>Darf er das laut Standard überhaupt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282857</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 22:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 22:01:18 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>aber die sind doch in dem Moment vorhanden wo die Klasse instanziiert wird. Und zum Beispiel der gcc versucht dann jede Funktion zu instanziieren, selbst wenn sie nicht aufgerufen wird.</p>
</blockquote>
<p>Sollte er eigentlich nicht, sofern es nicht eine explizite Instantiierung der Klasse oder aber die Funktion selbst virtuell ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282859</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 23 Dec 2012 22:01:18 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 22:03:48 GMT]]></title><description><![CDATA[<p>&lt;strong&gt;N3337 §14.7.1 / 1&lt;/strong&gt; schrieb:</p>
<blockquote>
<p>The implicit instantiation of a class template specialization causes the implicit instantiation of the declarations, <strong>but not of the definitions</strong> or default arguments, of the class member functions</p>
</blockquote>
<p>Ist das der richtige Teil?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282861</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 23 Dec 2012 22:03:48 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Sun, 23 Dec 2012 22:08:57 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>&lt;strong&gt;N3337 §14.7.1 / 1&lt;/strong&gt; schrieb:</p>
<blockquote>
<p>The implicit instantiation of a class template specialization causes the implicit instantiation of the declarations, <strong>but not of the definitions</strong> or default arguments, of the class member functions</p>
</blockquote>
<p>Ist das der richtige Teil?</p>
</blockquote>
<p>ja</p>
<pre><code class="language-cpp">template &lt;bool R, bool W&gt;
struct X {
  void read()
  {
      static_assert( R, &quot;read not enable for this type!&quot; );
      // ...
  }
  void write()
  {
      static_assert( W, &quot;write not enable for this type!&quot; );
      // ...
  }
  bool is_open() const {};
};

X&lt;false,false&gt; a;
X&lt;false,true&gt; b;
X&lt;true,false&gt; c;
X&lt;true,true&gt; d;

//template struct X&lt;false,false&gt;;

int main() {}
</code></pre>
<p>wird anstandslos von g++ 4.3.6, 4.4.7, 4.5.4, 4.6.3, 4.7.2, 4.8.0 (20121216) und clang++ 3.2 kompiliert.<br />
Eine explizite Instantiierung (außer &lt;true,true&gt;) oder die Deklaration als virtuelle Funktion führt dagegen zum Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282863</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 23 Dec 2012 22:08:57 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Mon, 24 Dec 2012 13:25:50 GMT]]></title><description><![CDATA[<p>Problem ist aber: wenn write() zB Schreibzugriff auf etwas vordert dass nur Schreibzugriff hat wenn W true ist - dann gibt es Fehler.</p>
<p>Deshalb gefaellt mir Nexus' Variante am besten - da sie flexibel ist.</p>
<p>Bei read/write koennte ich ja zB eine datei einmal als readonly, writeonly und einmal als read/write oeffnen wollen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2282992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2282992</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 24 Dec 2012 13:25:50 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Tue, 25 Dec 2012 00:57:25 GMT]]></title><description><![CDATA[<p>Ich verstehe das Problem nicht.<br />
Ein einfaches &quot;if (W)&quot; im Konstruktor um den Open-Mode anzupassen sollte doch reichen.<br />
write() kann doch eh nicht instanziert werden wenn W <em>nicht</em> <em>true</em> ist, also wo soll es da zu einem Problem kommen?<br />
Vor allem verstehe ich nicht was die Basisklassen-Variante dabei besser machen/mehr können sollte.</p>
<p>Ich steh grad ziemlich aufm Schlauch oder du hast dich vertan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283062</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Dec 2012 00:57:25 GMT</pubDate></item><item><title><![CDATA[Reply to mit Templateargument Methoden &amp;quot;entfernen&amp;quot;? on Tue, 25 Dec 2012 18:46:43 GMT]]></title><description><![CDATA[<p>ich habe mich für die einfache static_assert Variante entschieden.<br />
Eindeutig, einfach, gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>[Danke für das Brainstorming]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2283214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2283214</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Tue, 25 Dec 2012 18:46:43 GMT</pubDate></item></channel></rss>