<?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[[Templates] Parametertyp eines Funktionszeigers ermitteln]]></title><description><![CDATA[<p>Hallo!</p>
<p>folgendes:</p>
<pre><code class="language-cpp">// Diese Struktur ruft add&lt;From&gt;(f) auf, für einen Aufruf des op().
// Sie wird von mpl::for_each aufgerufen

template&lt;class Param&gt;
struct reg_type
{
	PyObject* (*f)(Param);
	reg_type(PyObject* (*func)(Param)) : f(func) {}

	template &lt;class From&gt;
	void operator()(From /*unused*/)
	{
		add&lt;From&gt;(f);
	}
};
</code></pre>
<p>Aufrufen tue ich das ganze so (vereinfacht): (eigentlich von boost::mpl::for_each, deswegen die komische Syntax)</p>
<pre><code class="language-cpp">reg_type&lt;long&gt;(PyInt_FromLong) o;
o.operator()&lt;int&gt;();
o.operator()&lt;char&gt;();
o.operator()&lt;long&gt;();
</code></pre>
<p>Ich möchte das Objekt aber so erstellen können:</p>
<pre><code class="language-cpp">reg_type(PyInt_FromLong) o;
</code></pre>
<p>Also ohne die explizite Angabe, dass PyInt_FromLong als Parameter ein long erwartet.</p>
<p>Ich bräuchte also eine Struktur o.ä. welche aus einem Funktionszeiger, welcher PyObject* zurückgibt und einen Parameter erwartet, den Typ des Parameters errechnet.</p>
<p>DAs heir ginge, wäre ja aber genauso schlimm, da ich den Parameter aufrufen wieder angeben muss:</p>
<pre><code class="language-cpp">template &lt;class P, PyObject* (*f)(P)&gt; 
struct get_ret_type
{
	typedef P type;
};
</code></pre>
<p>Habt ihr eine Idee? Das kann man bestimmt irgendwie erreichen, da es ja schon nervig ist, diesen redundanten Parameter immer mit anzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218859/templates-parametertyp-eines-funktionszeigers-ermitteln</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 16:57:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218859.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 Jul 2008 15:06:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Templates] Parametertyp eines Funktionszeigers ermitteln on Sat, 26 Jul 2008 15:06:24 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>folgendes:</p>
<pre><code class="language-cpp">// Diese Struktur ruft add&lt;From&gt;(f) auf, für einen Aufruf des op().
// Sie wird von mpl::for_each aufgerufen

template&lt;class Param&gt;
struct reg_type
{
	PyObject* (*f)(Param);
	reg_type(PyObject* (*func)(Param)) : f(func) {}

	template &lt;class From&gt;
	void operator()(From /*unused*/)
	{
		add&lt;From&gt;(f);
	}
};
</code></pre>
<p>Aufrufen tue ich das ganze so (vereinfacht): (eigentlich von boost::mpl::for_each, deswegen die komische Syntax)</p>
<pre><code class="language-cpp">reg_type&lt;long&gt;(PyInt_FromLong) o;
o.operator()&lt;int&gt;();
o.operator()&lt;char&gt;();
o.operator()&lt;long&gt;();
</code></pre>
<p>Ich möchte das Objekt aber so erstellen können:</p>
<pre><code class="language-cpp">reg_type(PyInt_FromLong) o;
</code></pre>
<p>Also ohne die explizite Angabe, dass PyInt_FromLong als Parameter ein long erwartet.</p>
<p>Ich bräuchte also eine Struktur o.ä. welche aus einem Funktionszeiger, welcher PyObject* zurückgibt und einen Parameter erwartet, den Typ des Parameters errechnet.</p>
<p>DAs heir ginge, wäre ja aber genauso schlimm, da ich den Parameter aufrufen wieder angeben muss:</p>
<pre><code class="language-cpp">template &lt;class P, PyObject* (*f)(P)&gt; 
struct get_ret_type
{
	typedef P type;
};
</code></pre>
<p>Habt ihr eine Idee? Das kann man bestimmt irgendwie erreichen, da es ja schon nervig ist, diesen redundanten Parameter immer mit anzugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554018</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 26 Jul 2008 15:06:24 GMT</pubDate></item><item><title><![CDATA[Reply to [Templates] Parametertyp eines Funktionszeigers ermitteln on Sun, 27 Jul 2008 09:32:27 GMT]]></title><description><![CDATA[<p>*push*<br />
Geht das überhaupt nicht, oder weiß es nur keiner?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554416</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 27 Jul 2008 09:32:27 GMT</pubDate></item><item><title><![CDATA[Reply to [Templates] Parametertyp eines Funktionszeigers ermitteln on Sun, 27 Jul 2008 09:50:04 GMT]]></title><description><![CDATA[<p>Maxi schrieb:</p>
<blockquote>
<p>*push*<br />
Geht das überhaupt nicht, oder weiß es nur keiner?</p>
</blockquote>
<p>Es geht leider nicht. Mit dem nächsten Standard könnte man auto einsetzen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
reg_type&lt;T&gt; get_reg_type(PyObject* (*func)(T))
{
    return reg_type&lt;T&gt;( func );
}

auto o = get_reg_type( PyInt_FromLong );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1554431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554431</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 27 Jul 2008 09:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to [Templates] Parametertyp eines Funktionszeigers ermitteln on Sun, 27 Jul 2008 09:52:25 GMT]]></title><description><![CDATA[<p>Das hier dürfte gehen. Allerdings musst du dann halt um dein Objekt zu erstellen über die Hilfsfunktion und nicht über den eigentlichen Konstruktor gehen (so ähnlich wie bei std::make_pair):</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
reg_type&lt;T&gt; CreateRegType(PyObject* (*f)(T))
{
    return reg_type&lt;T&gt;(f);
}
</code></pre>
<p>Felix</p>
<p>EDIT: Stimmt, jetzt wo ich campers post sehe, fällt mir ein, dass das auch nichts bringt, weil du ja den Typ immer noch angeben müsstest <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Je nachdem, was du machst, könntest du höchstens eine gemeinsame Basisklasse für alle Instanziierungen des Templates machen (das habe ich für einen Callable-Object-Wrapper mal gemacht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554433</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sun, 27 Jul 2008 09:52:25 GMT</pubDate></item><item><title><![CDATA[Reply to [Templates] Parametertyp eines Funktionszeigers ermitteln on Sun, 27 Jul 2008 09:55:32 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Es geht leider nicht. Mit dem nächsten Standard könnte man auto einsetzen:</p>
</blockquote>
<p>Gibt es mit dem nächsten Standard nicht auch eine automatische Templateerkennung für Klassen? Wodurch solche Funktionen überflüssig werden? Oder hab ich das falsch in Erinnerung oder wars anders ... *kopfkratz*</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554438</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 27 Jul 2008 09:55:32 GMT</pubDate></item><item><title><![CDATA[Reply to [Templates] Parametertyp eines Funktionszeigers ermitteln on Sun, 27 Jul 2008 13:39:03 GMT]]></title><description><![CDATA[<p>Phoemuex schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;typename T&gt;
reg_type&lt;T&gt; CreateRegType(PyObject* (*f)(T))
{
    return reg_type&lt;T&gt;(f);
}
</code></pre>
</blockquote>
<p>Super, das reicht für meine Zwecke aus, hätt ich aber selbst drauf kommen können, ist ja wirklich bei bei std::make_pair oder std:.bind1st oder so <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="🙂"
    /><br />
Eingesetzt wirds so:</p>
<pre><code class="language-cpp">template &lt;class T&gt; struct wrap {};

template&lt;class Param&gt;
struct reg_type
{
	PyObject* (*f)(Param);
	reg_type(PyObject* (*func)(Param)) : f(func) {}

	template &lt;class From&gt;
	void operator()(wrap&lt;From&gt;)
	{
		add_to_python&lt;From&gt;(f);
	}
};

template &lt;class Param&gt; 
reg_type&lt;Param&gt; get_reg_type(PyObject* (*f)(Param))
{
	return reg_type&lt;Param&gt;(f);
}

// Add integral types 
typedef mpl::vector&lt;char, short, int, long, long long,
		unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long,
		signed char, signed short, signed int, signed long, signed long long		
	&gt;::type integrals;
	mpl::for_each&lt;integrals, wrap&lt;_1&gt; &gt;(get_reg_type(PyInt_FromLong));
</code></pre>
<p>Vielen Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1554562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1554562</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 27 Jul 2008 13:39:03 GMT</pubDate></item></channel></rss>