<?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[pointer auf member functions mappen]]></title><description><![CDATA[<p>Hallo an alle!<br />
Ich habe leider niergendwo eine Antwort auf folgendes Problem finden können. Vielleicht kann jemand von euch mir helfen.</p>
<p>Folgende Problemstellung:<br />
Ich habe eine Abstrakte Basisklasse, die aber eine funktion zur Verfügung stellt mit der ich die eigenschaften der jeweiligen abgeleiteten Klassen auflisten kann und anhang des Schlüssels die entsprechende Funktion für die jeweilige eigenschaft aufrufen kann.</p>
<p>Hier die sehr vereinfachte Variante ohne Vererbung damit man das Problem besser sehen kann.</p>
<pre><code class="language-cpp">class B {
public:
  int foo1() { return 1; }
  int foo2() { return 2; }
};

typedef int (B::*__func_ptr)();

class A {
private:
  std::map&lt;std::string, __func_ptr&gt; m_prop_map;
  ...
  ...
public:
  A() {
    m_prop_map[&quot;func1&quot;] = &amp;B::foo1();
    m_prop_map[&quot;func2&quot;] = &amp;B::foo2();
  }
  virtual const std::map&lt;std::string, __func_ptr&gt; listProperties() {
    return m_prop_map;
  }
}

int main() {

  B b;
  A a;

  // Wenn man die funktionen aus der map benutzen möchte muss man sich der 
  // folgenden kryptischen Syntax bedienen.
  const std::map&lt;std::string, __func_ptr&gt; m = a.listProperties();
  int i1 = (a.*m[&quot;func1&quot;])();
  int i2 = (a.*m[&quot;func1&quot;])();
  // was sehr unschön ist

  std::sout &lt;&lt; i1 &lt;&lt; &quot; &quot; &lt;&lt; i2 &lt;&lt; std::endl;
  return 0;
}
</code></pre>
<p>Anstatt von disen Aufrufen</p>
<pre><code class="language-cpp">int i1 = (a.*m[&quot;func1&quot;])();
  int i2 = (a.*m[&quot;func1&quot;])();
</code></pre>
<p>möchte ich folgendes haben:</p>
<pre><code class="language-cpp">int i1 = m[&quot;func1&quot;];
  int i2 = m[&quot;func1&quot;];
</code></pre>
<p>Also habe ich mir gedacht, schreib doch eine wrapper, der den Aufruf</p>
<pre><code class="language-cpp">(a.*m[&quot;func1&quot;])();
</code></pre>
<p>intern ausführt.</p>
<p>Der Ansatz sieht dann so aus:<br />
(Die Klasse B und der typdef für den Funktionspointer sieht wie in dem oberen listing aus)</p>
<pre><code class="language-cpp">class FuncWrap : public std::unary_function&lt;std::string, __func_ptr&gt; {
private:
	B m_a;
	__func_ptr m_fp;
public:

	FuncWrap(B b, __func_ptr fp) {
		m_b = b;
		m_fp = m_fp;
	}

	int operator()() {
		return (m_b.*m_fp)();
	}
};

class A {
	public:
	std::map&lt;std::string, std::unary_function&lt;std::string, __func_ptr&gt; &gt; m_prop_map;

	A() {
		m_prop_map;[&quot;func1&quot;] = FuncWrap(B(), &amp;B::func1);
		m_prop_map;[&quot;func2&quot;] = FuncWrap(B(), &amp;B::func2);
	}

        virtual const std::map&lt;std::string, std::unary_function&lt;std::string, __func_ptr&gt; listProperties() {
               return m_prop_map;
        }
};
</code></pre>
<p>Nun mache ich den gewünschten aufruf in der main:</p>
<pre><code class="language-cpp">int main() {

  A c;

  const std::map&lt;std::string, __func_ptr&gt; m = a.listProperties();
  int i1 = m[&quot;func1&quot;];
  int i2 = m[&quot;func1&quot;];

  std::sout &lt;&lt; i1 &lt;&lt; &quot; &quot; &lt;&lt; i2 &lt;&lt; std::endl;
  return 0;
}
</code></pre>
<p>und kriege leider einige Compiler Fehler. Für die Aufrufe wie oben sieht die fehlermeldung so aus:</p>
<pre><code>Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -I/ ... /src/include -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -osrc/test.o ../src/test.cpp
../src/test.cpp: In function 'int main()':
../src/test.cpp:96: error: cannot convert 'std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;' to 'int' in initialization
../src/test.cpp:97: error: cannot convert 'std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;' to 'int' in initialization
make: *** [src/test.o] Fehler 1
</code></pre>
<p>Was eigentlich klar ist, da ich funktionapointer zu int konvertieren möchte;</p>
<p>Für den fall, dass der Aufruf so aussieht:</p>
<pre><code class="language-cpp">int i1 = m[&quot;func1&quot;]();
  int i2 = m[&quot;func1&quot;]();
</code></pre>
<p>folgende fehlermeldung:</p>
<pre><code>make -k all 
Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -I/ ... /src/include -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -osrc/test.o ../src/test.cpp
../src/test.cpp: In function 'int main()':
../src/test.cpp:96: error: no match for call to '(std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;) ()'
../src/test.cpp:97: error: no match for call to '(std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;) ()'
make: *** [src/test.o] Fehler 1
make: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
Build complete for project ...
</code></pre>
<p>Ich hoffe ich konnte verdeutlichen, wo das Problem liegt. Wenn jemand einen Lösungsvorschlag hätte wäre das super.</p>
<p>Danke in Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/141781/pointer-auf-member-functions-mappen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 15:13:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/141781.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Mar 2006 22:12:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to pointer auf member functions mappen on Fri, 24 Mar 2006 22:12:35 GMT]]></title><description><![CDATA[<p>Hallo an alle!<br />
Ich habe leider niergendwo eine Antwort auf folgendes Problem finden können. Vielleicht kann jemand von euch mir helfen.</p>
<p>Folgende Problemstellung:<br />
Ich habe eine Abstrakte Basisklasse, die aber eine funktion zur Verfügung stellt mit der ich die eigenschaften der jeweiligen abgeleiteten Klassen auflisten kann und anhang des Schlüssels die entsprechende Funktion für die jeweilige eigenschaft aufrufen kann.</p>
<p>Hier die sehr vereinfachte Variante ohne Vererbung damit man das Problem besser sehen kann.</p>
<pre><code class="language-cpp">class B {
public:
  int foo1() { return 1; }
  int foo2() { return 2; }
};

typedef int (B::*__func_ptr)();

class A {
private:
  std::map&lt;std::string, __func_ptr&gt; m_prop_map;
  ...
  ...
public:
  A() {
    m_prop_map[&quot;func1&quot;] = &amp;B::foo1();
    m_prop_map[&quot;func2&quot;] = &amp;B::foo2();
  }
  virtual const std::map&lt;std::string, __func_ptr&gt; listProperties() {
    return m_prop_map;
  }
}

int main() {

  B b;
  A a;

  // Wenn man die funktionen aus der map benutzen möchte muss man sich der 
  // folgenden kryptischen Syntax bedienen.
  const std::map&lt;std::string, __func_ptr&gt; m = a.listProperties();
  int i1 = (a.*m[&quot;func1&quot;])();
  int i2 = (a.*m[&quot;func1&quot;])();
  // was sehr unschön ist

  std::sout &lt;&lt; i1 &lt;&lt; &quot; &quot; &lt;&lt; i2 &lt;&lt; std::endl;
  return 0;
}
</code></pre>
<p>Anstatt von disen Aufrufen</p>
<pre><code class="language-cpp">int i1 = (a.*m[&quot;func1&quot;])();
  int i2 = (a.*m[&quot;func1&quot;])();
</code></pre>
<p>möchte ich folgendes haben:</p>
<pre><code class="language-cpp">int i1 = m[&quot;func1&quot;];
  int i2 = m[&quot;func1&quot;];
</code></pre>
<p>Also habe ich mir gedacht, schreib doch eine wrapper, der den Aufruf</p>
<pre><code class="language-cpp">(a.*m[&quot;func1&quot;])();
</code></pre>
<p>intern ausführt.</p>
<p>Der Ansatz sieht dann so aus:<br />
(Die Klasse B und der typdef für den Funktionspointer sieht wie in dem oberen listing aus)</p>
<pre><code class="language-cpp">class FuncWrap : public std::unary_function&lt;std::string, __func_ptr&gt; {
private:
	B m_a;
	__func_ptr m_fp;
public:

	FuncWrap(B b, __func_ptr fp) {
		m_b = b;
		m_fp = m_fp;
	}

	int operator()() {
		return (m_b.*m_fp)();
	}
};

class A {
	public:
	std::map&lt;std::string, std::unary_function&lt;std::string, __func_ptr&gt; &gt; m_prop_map;

	A() {
		m_prop_map;[&quot;func1&quot;] = FuncWrap(B(), &amp;B::func1);
		m_prop_map;[&quot;func2&quot;] = FuncWrap(B(), &amp;B::func2);
	}

        virtual const std::map&lt;std::string, std::unary_function&lt;std::string, __func_ptr&gt; listProperties() {
               return m_prop_map;
        }
};
</code></pre>
<p>Nun mache ich den gewünschten aufruf in der main:</p>
<pre><code class="language-cpp">int main() {

  A c;

  const std::map&lt;std::string, __func_ptr&gt; m = a.listProperties();
  int i1 = m[&quot;func1&quot;];
  int i2 = m[&quot;func1&quot;];

  std::sout &lt;&lt; i1 &lt;&lt; &quot; &quot; &lt;&lt; i2 &lt;&lt; std::endl;
  return 0;
}
</code></pre>
<p>und kriege leider einige Compiler Fehler. Für die Aufrufe wie oben sieht die fehlermeldung so aus:</p>
<pre><code>Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -I/ ... /src/include -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -osrc/test.o ../src/test.cpp
../src/test.cpp: In function 'int main()':
../src/test.cpp:96: error: cannot convert 'std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;' to 'int' in initialization
../src/test.cpp:97: error: cannot convert 'std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;' to 'int' in initialization
make: *** [src/test.o] Fehler 1
</code></pre>
<p>Was eigentlich klar ist, da ich funktionapointer zu int konvertieren möchte;</p>
<p>Für den fall, dass der Aufruf so aussieht:</p>
<pre><code class="language-cpp">int i1 = m[&quot;func1&quot;]();
  int i2 = m[&quot;func1&quot;]();
</code></pre>
<p>folgende fehlermeldung:</p>
<pre><code>make -k all 
Building file: ../src/test.cpp
Invoking: GCC C++ Compiler
g++ -I/ ... /src/include -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -osrc/test.o ../src/test.cpp
../src/test.cpp: In function 'int main()':
../src/test.cpp:96: error: no match for call to '(std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;) ()'
../src/test.cpp:97: error: no match for call to '(std::unary_function&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, int (A::*)()&gt;) ()'
make: *** [src/test.o] Fehler 1
make: Das Target »all« wurde wegen Fehlern nicht aktualisiert.
Build complete for project ...
</code></pre>
<p>Ich hoffe ich konnte verdeutlichen, wo das Problem liegt. Wenn jemand einen Lösungsvorschlag hätte wäre das super.</p>
<p>Danke in Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1023452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1023452</guid><dc:creator><![CDATA[dadrus]]></dc:creator><pubDate>Fri, 24 Mar 2006 22:12:35 GMT</pubDate></item></channel></rss>