<?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[Parameterliste von Funktion in Abhängigkeit vom Template?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bastel grad mal wieder mit C++ rum und habe folgendes Problem:</p>
<p>Ich würde gerne eine Erzeugerfunktion (für Komponenten eines Entity-Component-Systems) schreiben, welche in Abhängigkeit von dem übergebenen Templatetyp (oder auf andere Weise) eine unterschiedliche Zahl von Parametern verlangt, die auch vom Typ her verschieden sein dürfen.</p>
<p>Also z.B. hätte ich gerne das</p>
<pre><code>dummyCreate&lt;Foo&gt;(1,2,&quot;dummy&quot;);
dummyCreate&lt;Bar&gt;('d');
</code></pre>
<p>funktioniert. Natürlich nicht zwingend mit Templates, hatte nur direkt daran denken müssen.<br />
Oder meint ihr, dass es sinnvoller ist einfach separate Funktionen für Foo und Bar zu schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/336990/parameterliste-von-funktion-in-abhängigkeit-vom-template</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 15:14:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336990.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Feb 2016 23:25:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parameterliste von Funktion in Abhängigkeit vom Template? on Sun, 28 Feb 2016 23:25:46 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich bastel grad mal wieder mit C++ rum und habe folgendes Problem:</p>
<p>Ich würde gerne eine Erzeugerfunktion (für Komponenten eines Entity-Component-Systems) schreiben, welche in Abhängigkeit von dem übergebenen Templatetyp (oder auf andere Weise) eine unterschiedliche Zahl von Parametern verlangt, die auch vom Typ her verschieden sein dürfen.</p>
<p>Also z.B. hätte ich gerne das</p>
<pre><code>dummyCreate&lt;Foo&gt;(1,2,&quot;dummy&quot;);
dummyCreate&lt;Bar&gt;('d');
</code></pre>
<p>funktioniert. Natürlich nicht zwingend mit Templates, hatte nur direkt daran denken müssen.<br />
Oder meint ihr, dass es sinnvoller ist einfach separate Funktionen für Foo und Bar zu schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2488946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2488946</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sun, 28 Feb 2016 23:25:46 GMT</pubDate></item><item><title><![CDATA[Reply to Parameterliste von Funktion in Abhängigkeit vom Template? on Sun, 28 Feb 2016 23:41:10 GMT]]></title><description><![CDATA[<p>Was haltet ihr von</p>
<pre><code>template&lt;typename T, typename V&gt;
void myGenerator(V v)
{
 std::cout &lt;&lt; std::get&lt;0&gt;(v) &lt;&lt; std::endl; //dummy ausgabe
}

int main()
{
myGenerator&lt;Foo&gt;(std::make_tuple(1,2,&quot;test&quot;));
return 0;
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2488947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2488947</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sun, 28 Feb 2016 23:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to Parameterliste von Funktion in Abhängigkeit vom Template? on Sun, 28 Feb 2016 23:51:25 GMT]]></title><description><![CDATA[<pre><code>template &lt;typename T, typename... Args&gt;
void dummyCreate(Args&amp;&amp;... args) {
    // Tu etwas mit args
}
</code></pre>
<p>Warum die Natur der Argumente direkt eingeschränkt werden sollte, ist unklar. Lieber einfach benutzen wie gewünscht; falsche Argumente führen halt zu einem Fehler bei der Instantiierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2488948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2488948</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 28 Feb 2016 23:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Parameterliste von Funktion in Abhängigkeit vom Template? on Sun, 28 Feb 2016 23:56:12 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>template &lt;typename T, typename... Args&gt;
void dummyCreate(Args&amp;&amp;... args) {
    // Tu etwas mit args
}
</code></pre>
<p>Warum die Natur der Argumente direkt eingeschränkt werden sollte, ist unklar. Lieber einfach benutzen wie gewünscht; falsche Argumente führen halt zu einem Fehler bei der Instantiierung.</p>
</blockquote>
<p>Ah, daran hatte ich mich nebulös erinnert aber bin nicht mehr drauf gekommen^^ Danke, ich schau mal ob ich deine oder meine Variante benutze <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2488949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2488949</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Sun, 28 Feb 2016 23:56:12 GMT</pubDate></item><item><title><![CDATA[Reply to Parameterliste von Funktion in Abhängigkeit vom Template? on Mon, 29 Feb 2016 01:42:50 GMT]]></title><description><![CDATA[<p>Weitere Frage:</p>
<p>Nun habe ich testweise folgendes geschrieben:</p>
<pre><code>template &lt;typename T&gt;
    void addComponent(const Entity&amp; e)
    {
        std::cout &lt;&lt; &quot;done\n&quot;;
    }

    template &lt;typename T, typename V, typename ...Args&gt;
    void addComponent(const Entity&amp; e, const V&amp; v, const Args&amp;... args) {
        unsigned int n = sizeof...(args);
        std::cout &lt;&lt; v &lt;&lt; std::endl;
        addComponent&lt;T&gt;(e, args...);
    }
</code></pre>
<p>was leider nicht funktioniert.<br />
Streit man jedoch die &quot;unsigned int n = ...&quot; Zeile funktioniert es fehlerlos.<br />
Was ist hier los?</p>
<p>Fehlermeldung im oberen Fall ist:</p>
<blockquote>
<p>||=== Build: Debug in sfml2_2_base (compiler: GNU GCC Compiler) ===|<br />
D:\Projekte\sfml2_2_base\main.cpp||In instantiation of 'void UnitFactory::addComponent(const Entity&amp;, const V&amp;, const Args&amp; ...) [with T = DummyComponent; V = int; Args = {int, char [5]}; Entity = unsigned int]':|<br />
D:\Projekte\sfml2_2_base\main.cpp|119|required from here|<br />
D:\Projekte\sfml2_2_base\main.cpp|131|warning: unused variable 'n' [-Wunused-variable]|<br />
D:\Projekte\sfml2_2_base\main.cpp||In instantiation of 'void UnitFactory::addComponent(const Entity&amp;, const V&amp;, const Args&amp; ...) [with T = DummyComponent; V = int; Args = {char [5]}; Entity = unsigned int]':|<br />
D:\Projekte\sfml2_2_base\main.cpp|133|required from 'void UnitFactory::addComponent(const Entity&amp;, const V&amp;, const Args&amp; ...) [with T = DummyComponent; V = int; Args = {int, char [5]}; Entity = unsigned int]'|<br />
D:\Projekte\sfml2_2_base\main.cpp|119|required from here|<br />
D:\Projekte\sfml2_2_base\main.cpp|131|warning: unused variable 'n' [-Wunused-variable]|<br />
D:\Projekte\sfml2_2_base\main.cpp||In instantiation of 'void UnitFactory::addComponent(const Entity&amp;, const V&amp;, const Args&amp; ...) [with T = DummyComponent; V = char [5]; Args = {}; Entity = unsigned int]':|<br />
D:\Projekte\sfml2_2_base\main.cpp|133| recursively required from 'void UnitFactory::addComponent(const Entity&amp;, const V&amp;, const Args&amp; ...) [with T = DummyComponent; V = int; Args = {char [5]}; Entity = unsigned int]'|<br />
D:\Projekte\sfml2_2_base\main.cpp|133|required from 'void UnitFactory::addComponent(const Entity&amp;, const V&amp;, const Args&amp; ...) [with T = DummyComponent; V = int; Args = {int, char [5]}; Entity = unsigned int]'|<br />
D:\Projekte\sfml2_2_base\main.cpp|119|required from here|<br />
D:\Projekte\sfml2_2_base\main.cpp|131|warning: unused variable 'n' [-Wunused-variable]|<br />
||=== Build finished: 1 error(s), 11 warning(s) (0 minute(s), 1 second(s)) ===|</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2488950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2488950</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Mon, 29 Feb 2016 01:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to Parameterliste von Funktion in Abhängigkeit vom Template? on Mon, 29 Feb 2016 02:19:43 GMT]]></title><description><![CDATA[<p>Seltsam, <a href="http://Ideone.com" rel="nofollow">Ideone.com</a> kompiliert es ohne Probleme.<br />
Bug vom GCC?</p>
<p>Ganzes Programm zum Copy+Paste und runnen (Zeile 103 fängt die Klasse an):</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;list&gt;
#include &lt;unordered_map&gt;
#include &lt;memory&gt;
#include &lt;tuple&gt;

class BaseComponent;

typedef unsigned int ID;
typedef ID Entity;
typedef unsigned int Type;

Type global_type = 0;

enum class ComponentType {DUMMYCOMPONENT=0, DUMMYCOMPONENT1};

typedef std::vector&lt;std::unique_ptr&lt;BaseComponent&gt;&gt; Components;
typedef std::vector&lt;Entity&gt; Entities;

struct EnumClassHash
{
    template &lt;typename T&gt;
    std::size_t operator()(T t) const
    {
        return static_cast&lt;std::size_t&gt;(t);
    }
};

template &lt;typename T&gt;
Type getType()
{
    static Type mytype = global_type++;
    return mytype;
}

std::unordered_map&lt;Entity, Components&gt; id2comp;
std::unordered_map&lt;ComponentType, Entities, EnumClassHash&gt; comp2id;

class BaseComponent
{
private:
    ComponentType m_type;

public:
    BaseComponent(const ComponentType type)
    :m_type(type)
    {}

    ComponentType Type() const
    {
        return m_type;
    }
};

class DummyComponent
:public BaseComponent
{
public:
    DummyComponent()
    :BaseComponent(ComponentType::DUMMYCOMPONENT)
    {

    }
};

class DummyComponent2
:public BaseComponent
{
public:
    DummyComponent2()
    :BaseComponent(ComponentType::DUMMYCOMPONENT1)
    {

    }
};

ID generateId()
{
    static ID current_id = 0;
    return current_id++;
}

Entity generateEntity()
{
    static Entity current_entity = 0;
    return current_entity++;
}

Entity createEntity()
{
    Entity e = generateEntity();
    id2comp[e];
    return e;
}

class UnitFactory
{
private:
    template &lt;typename T, typename ...Args&gt;
    T&amp; pass(const T&amp; t, const Args&amp;... args)
    {
        return t;
    }

public:
    UnitFactory(){}
    void buildUnit()
    {
        Entity e = generateEntity();
        addComponent&lt;DummyComponent&gt;(e, 2, 1, &quot;test&quot;);
        //addComponent&lt;DummyComponent2&gt;(e, 'c');
    }

    template &lt;typename T&gt;
    void addComponent(const Entity&amp; e)
    {
        std::cout &lt;&lt; &quot;done\n&quot;;
    }

    template &lt;typename T, typename V, typename ...Args&gt;
    void addComponent(const Entity&amp; e, const V&amp; v, const Args&amp;... args) {
        std::cout &lt;&lt; v &lt;&lt; std::endl;
        std::size_t n = sizeof...(args);
        addComponent&lt;T&gt;(e, args...);
    }
};

class SystemBase
{
private:
    ID m_id;
    virtual void onStartUp()=0;

public:
    SystemBase()
    :m_id(generateId())
    {}

    ~SystemBase()
    {}

    virtual void process()=0;
};

class SystemTest
:public SystemBase
{
private:
    void onStartUp()
    {
        //std::cout &lt;&lt; &quot;Starting up&quot; &lt;&lt; std::endl;
    }
public:
    SystemTest()
    :SystemBase()
    {
        onStartUp();
    }

    void process()
    {
        //std::cout &lt;&lt; &quot;Processing&quot; &lt;&lt; std::endl;
    }
};

int main()
{

    UnitFactory u;
    u.buildUnit();

    //Entity e = createEntity();

//    while (mygame.isRunning())
//    {
//        mygame.run();
//    }
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2488951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2488951</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Mon, 29 Feb 2016 02:19:43 GMT</pubDate></item><item><title><![CDATA[Reply to Parameterliste von Funktion in Abhängigkeit vom Template? on Mon, 29 Feb 2016 03:11:48 GMT]]></title><description><![CDATA[<p>Sooo, hat sich geklärt. Lag natürlich daran, dass die übergebenen Parameter (1,2, &quot;test&quot;) rvalues sind und ich ne Referenz verwendete. Kann zu, hat sich alles geklärt.</p>
<p>Sorry für den Wust, beim nächsten Mal dann mit Account <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2488953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2488953</guid><dc:creator><![CDATA[Namenloser324]]></dc:creator><pubDate>Mon, 29 Feb 2016 03:11:48 GMT</pubDate></item></channel></rss>