<?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[Allgemeine Frage zu Templaet &amp;quot;policies&amp;quot;]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mal eine allgemeine Frage an euch: Nehmen wir an, es gibt eine Klasse, mit der Benutzer arbeiten sollen. Diese Klasse ändert ihr Verhalten aufgrund eines Templateparameters (sowas in Richtung policy Classes). Welchen &quot;Stil&quot; würdet ihr in folgendem Beispiel bevorzugen? (Es geht hier ums Prinzip, nicht darum, dass man es mit std::accumulate direkt implementieren könnte...)</p>
<pre><code>const int Add = 0;
const int Mult = 1;

template&lt;int Policy&gt; //0 = addiere, 1 = multipliziere
class MathContainer
{
    double value;
public:
    void calculate(const std::vector&lt;double&gt;&amp;);
};

//Möglichkeit 1: Spezialisierung
template&lt;int Policy&gt; //&quot;default&quot; Fall
void MathContainer&lt;Policy&gt;::calculate(const std::vector&lt;double&gt;&amp; vec)
{
    value = 0.;
    for(std::vector&lt;double&gt;::size_type i=0; i!= vec.size(); ++i)
        value += vec[i]; 
}
template&lt;&gt; //weitere Spezialisierungen
void MathContainer&lt;1&gt;::calculate(const std::vector&lt;double&gt;&amp; vec)
{
    value = 1.;
    for(std::vector&lt;double&gt;::size_type i=0; i!= vec.size(); ++i)
        value *= vec[i]; 
}

//Möglichkeit 2: if/else
template&lt;int Policy&gt;
void MathContainer&lt;Policy&gt;::calculate(const std::vector&lt;double&gt;&amp; vec)
{
    if(Policy==Mult)
        value = 1.;
    else
        value = 0.;
    for(std::vector&lt;double&gt;::size_type i=0; i!= vec.size(); ++i)
        if(Policy==Mult)
            value *= vec[i];
        else
            value += vec[i];
}
</code></pre>
<p>In dem Fall sollten Performance Fragen ja eigentlich egal sein, da der Compiler in beiden Fällen den gleichen Code produzieren sollte. Ich persönlich finde Möglichkeit 1 besser verständlich, da man sofort sieht, was gemeint ist. Außerdem ist die Spezialisierung im allgemeinen flexibler. Wie seht ihr das? Welche Version würdet ihr in einem so einfachen Fall wählen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317796/allgemeine-frage-zu-templaet-quot-policies-quot</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 04:49:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317796.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Jun 2013 22:36:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Allgemeine Frage zu Templaet &amp;quot;policies&amp;quot; on Thu, 20 Jun 2013 22:36:16 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe mal eine allgemeine Frage an euch: Nehmen wir an, es gibt eine Klasse, mit der Benutzer arbeiten sollen. Diese Klasse ändert ihr Verhalten aufgrund eines Templateparameters (sowas in Richtung policy Classes). Welchen &quot;Stil&quot; würdet ihr in folgendem Beispiel bevorzugen? (Es geht hier ums Prinzip, nicht darum, dass man es mit std::accumulate direkt implementieren könnte...)</p>
<pre><code>const int Add = 0;
const int Mult = 1;

template&lt;int Policy&gt; //0 = addiere, 1 = multipliziere
class MathContainer
{
    double value;
public:
    void calculate(const std::vector&lt;double&gt;&amp;);
};

//Möglichkeit 1: Spezialisierung
template&lt;int Policy&gt; //&quot;default&quot; Fall
void MathContainer&lt;Policy&gt;::calculate(const std::vector&lt;double&gt;&amp; vec)
{
    value = 0.;
    for(std::vector&lt;double&gt;::size_type i=0; i!= vec.size(); ++i)
        value += vec[i]; 
}
template&lt;&gt; //weitere Spezialisierungen
void MathContainer&lt;1&gt;::calculate(const std::vector&lt;double&gt;&amp; vec)
{
    value = 1.;
    for(std::vector&lt;double&gt;::size_type i=0; i!= vec.size(); ++i)
        value *= vec[i]; 
}

//Möglichkeit 2: if/else
template&lt;int Policy&gt;
void MathContainer&lt;Policy&gt;::calculate(const std::vector&lt;double&gt;&amp; vec)
{
    if(Policy==Mult)
        value = 1.;
    else
        value = 0.;
    for(std::vector&lt;double&gt;::size_type i=0; i!= vec.size(); ++i)
        if(Policy==Mult)
            value *= vec[i];
        else
            value += vec[i];
}
</code></pre>
<p>In dem Fall sollten Performance Fragen ja eigentlich egal sein, da der Compiler in beiden Fällen den gleichen Code produzieren sollte. Ich persönlich finde Möglichkeit 1 besser verständlich, da man sofort sieht, was gemeint ist. Außerdem ist die Spezialisierung im allgemeinen flexibler. Wie seht ihr das? Welche Version würdet ihr in einem so einfachen Fall wählen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332938</guid><dc:creator><![CDATA[PolicyClasses]]></dc:creator><pubDate>Thu, 20 Jun 2013 22:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to Allgemeine Frage zu Templaet &amp;quot;policies&amp;quot; on Thu, 20 Jun 2013 22:46:34 GMT]]></title><description><![CDATA[<p>Ich sehe beides nicht als Policy.</p>
<pre><code class="language-cpp">struct Addieren {
  template &lt;typename T&gt; defaultval() { return 0; }
  template &lt;typename T&gt; static void opeq(T&amp; l, T const&amp; r)
  { l += r; }
};
struct Multiplizieren {
  template &lt;typename T&gt; defaultval() { return 1; }
  template &lt;typename T&gt; static void opeq(T&amp; l, T const&amp; r)
  { l *= r; }
};

template&lt;typename Policy&gt; // Addieren oder Multipliziere
class MathContainer
{
    double value;
public:
  calculate(const std::vector&lt;double&gt;&amp; vec)
  {
    value = Policy::defaultval&lt;double&gt;();
    for(std::vector&lt;double&gt;::size_type i=0; i!= vec.size(); ++i)
        Policy::opeq(value, vec[i]);
  }
};
</code></pre>
<p>Das macht den Code nicht nur generischer (der Nutzer kann neue Policies hinzufügen), sondern auch übersichtlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2332940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2332940</guid><dc:creator><![CDATA[politically]]></dc:creator><pubDate>Thu, 20 Jun 2013 22:46:34 GMT</pubDate></item></channel></rss>