<?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[&#x2F;&#x2F;template - lösung für a local variable cannot be used as a non-type argument?]]></title><description><![CDATA[<pre><code class="language-cpp">///////////////////////////////////////////////////////////////////////////////
//Aus &quot;C++ Templates - The Complete Guide&quot;
// primary template: yield second or third argument depending on first argument
template&lt;bool C, typename Ta, typename Tb&gt; class IfThenElse;

// partial specialization: true yields second argument
template&lt;typename Ta, typename Tb&gt; class IfThenElse&lt;true, Ta, Tb&gt; {
public:
   typedef Ta ResultT;
};
// partial specialization: false yields third argument
template&lt;typename Ta, typename Tb&gt; class IfThenElse&lt;false, Ta, Tb&gt; {
public:
   typedef Tb ResultT;
};
///////////////////////////////////////////////////////////////////////////////
//MEIN STUFF
namespace XXX{
enum Modell { FIRST=0, SECOND=1 };

template&lt; int Modell, bool AInsteadOfB&gt;
class MyModelTrait{
public:
   typedef typename IfThenElse&lt; AInsteadOfB , A, B &gt;::ResultT Test1;
};
//partielle Spezialisierung für Modell=FIRST
template&lt; bool AInsteadOfB &gt;
class MyModelTrait&lt; FIRST, AInsteadOfB &gt;{
public:
   typedef typename IfThenElse&lt; AInsteadOfB , A, B &gt;::ResultT Test1;
   typedef MyModelClassFIRST                                  ModelClass;
};
//partielle Spezialisierung für Modell=SECOND
template&lt; bool AInsteadOfB &gt;
class MyModelTrait&lt; SECOND, AInsteadOfB &gt;{
public:
   typedef typename IfThenElse&lt; AInsteadOfB , A, B &gt;::ResultT Test1;
   typedef MyModelClassSECOND                                 ModelClass;
};
}
</code></pre>
<p>Soweit so gut. Dass das Snipet relativ sinnfrei ist, ist mir bewußt (hier koennte bsp-weise man MyModelClassSECOND direkt als template Argmument übergeben). Darum geht es mir aber gar nicht.</p>
<p>Was mich interessiert ist folgendes:<br />
kann man das Problem mit &quot;a local variable cannot be used as a non-type argument&quot; irgendwie austricksen? So dass man zur Laufzeit Instanzen abhaenig von Variablen erzeugen kann?</p>
<p>sowas wie:</p>
<pre><code class="language-cpp">{
bool val1=true;
MyModelTrait&lt;FIRST,val1&gt; obj;
}
</code></pre>
<p>natürlich muss hierfür die Definiton von MyModelTrait&lt;FIRST,true&gt; beim Kompilieren bekannt sein. Wie geht man bei sowas am geschicktesten vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/207608/template-lösung-für-a-local-variable-cannot-be-used-as-a-non-type-argument</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 07:01:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/207608.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Mar 2008 20:22:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#x2F;&#x2F;template - lösung für a local variable cannot be used as a non-type argument? on Sun, 09 Mar 2008 20:22:11 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">///////////////////////////////////////////////////////////////////////////////
//Aus &quot;C++ Templates - The Complete Guide&quot;
// primary template: yield second or third argument depending on first argument
template&lt;bool C, typename Ta, typename Tb&gt; class IfThenElse;

// partial specialization: true yields second argument
template&lt;typename Ta, typename Tb&gt; class IfThenElse&lt;true, Ta, Tb&gt; {
public:
   typedef Ta ResultT;
};
// partial specialization: false yields third argument
template&lt;typename Ta, typename Tb&gt; class IfThenElse&lt;false, Ta, Tb&gt; {
public:
   typedef Tb ResultT;
};
///////////////////////////////////////////////////////////////////////////////
//MEIN STUFF
namespace XXX{
enum Modell { FIRST=0, SECOND=1 };

template&lt; int Modell, bool AInsteadOfB&gt;
class MyModelTrait{
public:
   typedef typename IfThenElse&lt; AInsteadOfB , A, B &gt;::ResultT Test1;
};
//partielle Spezialisierung für Modell=FIRST
template&lt; bool AInsteadOfB &gt;
class MyModelTrait&lt; FIRST, AInsteadOfB &gt;{
public:
   typedef typename IfThenElse&lt; AInsteadOfB , A, B &gt;::ResultT Test1;
   typedef MyModelClassFIRST                                  ModelClass;
};
//partielle Spezialisierung für Modell=SECOND
template&lt; bool AInsteadOfB &gt;
class MyModelTrait&lt; SECOND, AInsteadOfB &gt;{
public:
   typedef typename IfThenElse&lt; AInsteadOfB , A, B &gt;::ResultT Test1;
   typedef MyModelClassSECOND                                 ModelClass;
};
}
</code></pre>
<p>Soweit so gut. Dass das Snipet relativ sinnfrei ist, ist mir bewußt (hier koennte bsp-weise man MyModelClassSECOND direkt als template Argmument übergeben). Darum geht es mir aber gar nicht.</p>
<p>Was mich interessiert ist folgendes:<br />
kann man das Problem mit &quot;a local variable cannot be used as a non-type argument&quot; irgendwie austricksen? So dass man zur Laufzeit Instanzen abhaenig von Variablen erzeugen kann?</p>
<p>sowas wie:</p>
<pre><code class="language-cpp">{
bool val1=true;
MyModelTrait&lt;FIRST,val1&gt; obj;
}
</code></pre>
<p>natürlich muss hierfür die Definiton von MyModelTrait&lt;FIRST,true&gt; beim Kompilieren bekannt sein. Wie geht man bei sowas am geschicktesten vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471138</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Sun, 09 Mar 2008 20:22:11 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;template - lösung für a local variable cannot be used as a non-type argument? on Sun, 09 Mar 2008 20:27:47 GMT]]></title><description><![CDATA[<p>Laufzeitpolymorphie?<br />
Das ist schließlich sowas wie das „natürliche Analogon“ zur Compilezeitpolymorphie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471141</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sun, 09 Mar 2008 20:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to &#x2F;&#x2F;template - lösung für a local variable cannot be used as a non-type argument? on Sun, 09 Mar 2008 21:20:42 GMT]]></title><description><![CDATA[<p>naja, bisher verwende ich sowas wie:</p>
<pre><code class="language-cpp">template&lt; typename ModelTrait&gt;
class B{
 B() { MyModelTrait::ModelClass model; 
       MyModelTrait::Test1      test;  }
};

template&lt;int Modell&gt;  
SmartPtr&lt;B&gt; getCreatorForModel(bool AinsteadB);

template&lt;&gt;  
SmartPtr&lt;B&gt; getBPtr&lt;FIRST&gt;(bool AinsteadB)
{
   if(AinsteadB) return SmartPtr&lt;B&gt;(new B&lt;FIRST,true&gt;());
   return SmartPtr&lt;B&gt;(new B&lt;FIRST,false&gt;());
}
</code></pre>
<p>das muss doch irgendwie zu automatisieren sein!</p>
<p>nachtrag: es gibt derzeit 8 modelle und class B repräsentiert ein Modul, dass diverse parameter in abhängigkeit des models setzt. mittels traits werden vier verschiedene module (nennen wir sie C1...C3) deklariert, die sich nur im Typ von denen der anderen modelle unterscheiden. diese module sind auch temmplates, die eben mit A oder B belegt werden konenen.<br />
Also behandelt class B sowas wie folgende Fälle:</p>
<pre><code class="language-cpp">B&lt;FirstModel, FirstModelC1&lt;A&gt;, FirstModelC2&lt;A&gt;, FirstModelC3&lt;A&gt; &gt; a();
B&lt;FirstModel, FirstModelC1&lt;A&gt;, FirstModelC2&lt;B&gt;, FirstModelC3&lt;B&gt; &gt; b();
B&lt;FirstModel, FirstModelC1&lt;B&gt;, FirstModelC2&lt;A&gt;, FirstModelC3&lt;A&gt; &gt; c();
B&lt;FirstModel, FirstModelC1&lt;B&gt;, FirstModelC2&lt;B&gt;, FirstModelC3&lt;B&gt; &gt; d();

B&lt;SecondModel, SecondModelC1&lt;A&gt;, SecondModelC2&lt;A&gt;, SecondModelC3&lt;A&gt; &gt; a();
B&lt;SecondModel, SecondModelC1&lt;A&gt;, SecondModelC2&lt;B&gt;, SecondModelC3&lt;B&gt; &gt; b();
B&lt;SecondModel, SecondModelC1&lt;B&gt;, SecondModelC2&lt;A&gt;, SecondModelC3&lt;A&gt; &gt; c();
B&lt;SecondModel, SecondModelC1&lt;B&gt;, SecondModelC2&lt;B&gt;, SecondModelC3&lt;B&gt; &gt; d();

C....
</code></pre>
<p>die Klasse B lies sich wunderbar mit traits erschlagen. Zudem existiert eine BasisKlasse BaseB.<br />
Je nachdem welche Parameter man braucht wird die Klasse B als Strategy-Object zu einer anderen Klasse hunzugefügt (eben über den Basisklassen-Ptr). Und nun möcht eich noch ein eFunktion schreiben, die mit in Abhängigkeit von Model, A und B die entsprechende Instanz von B&lt;Model, A, B&gt; erzeugt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1471150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1471150</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Sun, 09 Mar 2008 21:20:42 GMT</pubDate></item></channel></rss>