<?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[Fehlende Funktionen und Felder bestimmter Objekte in Templates]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also ich habe in einen View mit bestimmten Objekt-Typen, die Parameter<br />
benötigen. Separat davon habe ich mehrere andere Objekte, die mögliche<br />
Parameter enthalten.<br />
Diese werden dann in das View gesetzt.<br />
Da ich den View für verschiedene Objekttypen verwenden möchte, habe ich<br />
es wie folgt geschrieben:</p>
<pre><code class="language-cpp">class MyParamA{
}; 

class MyParamB{
}; 

template&lt;typename TParam&gt;
class MyObject{
public:
        void setParameter(const TParam&amp;){}
};

template&lt;typename TParam&gt;
class MyData{
public:
        const TParam&amp; getParameter() const{
                return param;
        }

private:
        TParam param;
};

template&lt;typename TObject&gt;
class MyView{

public:

template&lt;typename TData&gt;
void setData(const TData&amp; data){
        object.setParameter(data.getParameter());
}             

private:      
        TObject object;
};            

int main(int argc, char**) {
        MyView&lt;MyObject&lt;MyParamA&gt; &gt; viewA;
        MyData&lt;MyParamA&gt; dataA;
        viewA.setData(dataA);

        MyView&lt;MyObject&lt;MyParamB&gt; &gt; viewB;
        MyData&lt;MyParamB&gt; dataB;
        viewB.setData(dataB);
}
</code></pre>
<p>Natürlich enthält der View und das Data-Objekt zusätzliche Informationen.<br />
Wenn ich jetzt meinen View mit einem Objekt hat, das keine Parameter<br />
benötigt habe ich mir folgendes gebastelt:</p>
<pre><code class="language-cpp">class SpecialObject{
};

template&lt;typename TObject, typename TData&gt;
class ParameterSetter{
public:
        static void setParameter(TObject&amp; object, const TData&amp; data);
};

template&lt;typename TData&gt;
class ParameterSetter&lt;SpecialObject, TData&gt;{
public:
        static void setParameter(SpecialObject&amp; object, const TData&amp; data);
};

template&lt;typename TObject, typename TData&gt;
void ParameterSetter&lt;TObject,TData&gt;::setParameter(TObject&amp; object, const TData&amp; data){
        object.setParameter(data.getParameter());
};

template&lt;typename TData&gt;
void ParameterSetter&lt;SpecialObject,TData&gt;::setParameter(SpecialObject&amp; object, const TData&amp; data){
};

template&lt;typename TObject&gt;
class MyView{

public:

template&lt;typename TData&gt;
void setData(const TData&amp; data){
        ParameterSetter&lt;TObject, TData&gt;::setParameter(object, data);
};            

private:      
        TObject object;
};

int main(int argc, char**) {
        MyView&lt;MyObject&lt;MyParamA&gt; &gt; viewA;
        MyData&lt;MyParamA&gt; dataA;
        viewA.setData(dataA);

        MyView&lt;MyObject&lt;MyParamB&gt; &gt; viewB;
        MyData&lt;MyParamB&gt; dataB;
        viewB.setData(dataB);

        MyView&lt;SpecialObject&gt; viewS;
        viewS.setData(dataB); // an object without this information
}
</code></pre>
<p>Geht es auch irgendwie eleganter?</p>
<p>Mein eigentliches Data-Objekt enthält natürlich mehrere Parameter-Daten.</p>
<p>Ich dachte an etwas wie:</p>
<pre><code class="language-cpp">template&lt;typename T1, typename T2, typename T3&gt;
class Data{

T1 t1;
T2 t2;
T3 t3;

};
</code></pre>
<p>Wie krieg ich es hin, dass ich eine Art 'none' übergebe (ohne Speicher zu verschwenden)?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/278776/fehlende-funktionen-und-felder-bestimmter-objekte-in-templates</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 02:15:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/278776.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 12 Dec 2010 22:37:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehlende Funktionen und Felder bestimmter Objekte in Templates on Sun, 12 Dec 2010 22:37:14 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>also ich habe in einen View mit bestimmten Objekt-Typen, die Parameter<br />
benötigen. Separat davon habe ich mehrere andere Objekte, die mögliche<br />
Parameter enthalten.<br />
Diese werden dann in das View gesetzt.<br />
Da ich den View für verschiedene Objekttypen verwenden möchte, habe ich<br />
es wie folgt geschrieben:</p>
<pre><code class="language-cpp">class MyParamA{
}; 

class MyParamB{
}; 

template&lt;typename TParam&gt;
class MyObject{
public:
        void setParameter(const TParam&amp;){}
};

template&lt;typename TParam&gt;
class MyData{
public:
        const TParam&amp; getParameter() const{
                return param;
        }

private:
        TParam param;
};

template&lt;typename TObject&gt;
class MyView{

public:

template&lt;typename TData&gt;
void setData(const TData&amp; data){
        object.setParameter(data.getParameter());
}             

private:      
        TObject object;
};            

int main(int argc, char**) {
        MyView&lt;MyObject&lt;MyParamA&gt; &gt; viewA;
        MyData&lt;MyParamA&gt; dataA;
        viewA.setData(dataA);

        MyView&lt;MyObject&lt;MyParamB&gt; &gt; viewB;
        MyData&lt;MyParamB&gt; dataB;
        viewB.setData(dataB);
}
</code></pre>
<p>Natürlich enthält der View und das Data-Objekt zusätzliche Informationen.<br />
Wenn ich jetzt meinen View mit einem Objekt hat, das keine Parameter<br />
benötigt habe ich mir folgendes gebastelt:</p>
<pre><code class="language-cpp">class SpecialObject{
};

template&lt;typename TObject, typename TData&gt;
class ParameterSetter{
public:
        static void setParameter(TObject&amp; object, const TData&amp; data);
};

template&lt;typename TData&gt;
class ParameterSetter&lt;SpecialObject, TData&gt;{
public:
        static void setParameter(SpecialObject&amp; object, const TData&amp; data);
};

template&lt;typename TObject, typename TData&gt;
void ParameterSetter&lt;TObject,TData&gt;::setParameter(TObject&amp; object, const TData&amp; data){
        object.setParameter(data.getParameter());
};

template&lt;typename TData&gt;
void ParameterSetter&lt;SpecialObject,TData&gt;::setParameter(SpecialObject&amp; object, const TData&amp; data){
};

template&lt;typename TObject&gt;
class MyView{

public:

template&lt;typename TData&gt;
void setData(const TData&amp; data){
        ParameterSetter&lt;TObject, TData&gt;::setParameter(object, data);
};            

private:      
        TObject object;
};

int main(int argc, char**) {
        MyView&lt;MyObject&lt;MyParamA&gt; &gt; viewA;
        MyData&lt;MyParamA&gt; dataA;
        viewA.setData(dataA);

        MyView&lt;MyObject&lt;MyParamB&gt; &gt; viewB;
        MyData&lt;MyParamB&gt; dataB;
        viewB.setData(dataB);

        MyView&lt;SpecialObject&gt; viewS;
        viewS.setData(dataB); // an object without this information
}
</code></pre>
<p>Geht es auch irgendwie eleganter?</p>
<p>Mein eigentliches Data-Objekt enthält natürlich mehrere Parameter-Daten.</p>
<p>Ich dachte an etwas wie:</p>
<pre><code class="language-cpp">template&lt;typename T1, typename T2, typename T3&gt;
class Data{

T1 t1;
T2 t2;
T3 t3;

};
</code></pre>
<p>Wie krieg ich es hin, dass ich eine Art 'none' übergebe (ohne Speicher zu verschwenden)?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993531</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 12 Dec 2010 22:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlende Funktionen und Felder bestimmter Objekte in Templates on Sun, 12 Dec 2010 23:44:51 GMT]]></title><description><![CDATA[<p><a href="http://www.c-plusplus.net/forum/p434303" rel="nofollow">http://www.c-plusplus.net/forum/p434303</a><br />
Für mein angedachtes 'none' könnte man ja eine empty class verwenden...</p>
<p>Jedoch benötigt diese leider Speicherplatz:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

struct Nothing{
};

template&lt;typename T1, typename T2&gt;
class Foo{
        T1 t1;
        T2 t2;
};

template&lt;typename T&gt;
class Bar{
        T t;
};

int main(int argc, char**) {
        Foo&lt;int, int&gt; foo1;
        Foo&lt;int, Nothing&gt; foo2;
        Foo&lt;Nothing, int&gt; foo3;
        Foo&lt;Nothing, Nothing&gt; foo4;
        std::cout &lt;&lt; sizeof(foo1) &lt;&lt; std::endl;
        std::cout &lt;&lt; sizeof(foo2) &lt;&lt; std::endl;
        std::cout &lt;&lt; sizeof(foo3) &lt;&lt; std::endl;
        std::cout &lt;&lt; sizeof(foo4) &lt;&lt; std::endl;
        Bar&lt;int&gt; bar1;
        Bar&lt;Nothing&gt; bar2;
        std::cout &lt;&lt; sizeof(bar1) &lt;&lt; std::endl;
        std::cout &lt;&lt; sizeof(bar2) &lt;&lt; std::endl;
}
</code></pre>
<blockquote>
<p>8<br />
8<br />
8<br />
2<br />
4<br />
1</p>
</blockquote>
<p>Wieso brauch foo4 bzw. bar2 Speicherplatz? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993552</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 12 Dec 2010 23:44:51 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlende Funktionen und Felder bestimmter Objekte in Templates on Sun, 12 Dec 2010 23:54:24 GMT]]></title><description><![CDATA[<p>IIRC müssen alle Member jeweils unterschiedliche Adressen haben, d. h. du brauchst pro Member mindestens ein Byte, auch wenn die Größe des Members eigentlich 0 ist.</p>
<p>Edit: Eigentlich brauchst du für die Unterscheidung von n Membern nur n-1 Bytes. Allerdings muss ein konkretes Objekt auch selbst noch eine Adresse und eine Größe von mindestens einem Byte haben (s. §1.8.5). An dieser Adresse darf das erste Attribut stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993555</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sun, 12 Dec 2010 23:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlende Funktionen und Felder bestimmter Objekte in Templates on Sun, 12 Dec 2010 23:55:09 GMT]]></title><description><![CDATA[<p>Danke Michael,</p>
<p>genau die Begründung habe ich gerade leider auch gefunden:<br />
<a href="http://msdn.microsoft.com/en-us/library/f42z47h2.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/f42z47h2.aspx</a></p>
<p>Auch wenn ich den gcc verwende...</p>
<p>EDIT:<br />
Oder auch hier:<br />
<a href="http://www2.research.att.com/~bs/bs_faq2.html#sizeof-empty" rel="nofollow">http://www2.research.att.com/~bs/bs_faq2.html#sizeof-empty</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1993556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1993556</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 12 Dec 2010 23:55:09 GMT</pubDate></item></channel></rss>