<?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[Implizite Typenumwandlung aktivieren.]]></title><description><![CDATA[<p>Gibt es eine Möglichkeit eine Typenumwandlung implizit zu ermöglichen?<br />
In etwa so:</p>
<pre><code class="language-cpp">class A
{
    // ... 
};
class B
{
    // ...
};

//  in etwa so (Konvertierungsoperator, funktioniert leider nur als nicht 
//  statische Methode einer Klasse)
operator A*(B* pB)
{
    // konvertiere B* nach A*, wie auch immer, z.B.:
    return reinterpret_cast&lt;A*&gt;(pB);
}
//  die Konvertierung zu einer Klasse kann man auch über einen ctor regeln, 
//  allerding sind Zeiger keine Klassen
//  auch der assign operator muss muss eine nicht-statische Methode einer Klasse sein
//  mir fällt keine weitere Möglichkeit ein, gibt es etwa keine? );
</code></pre>
<p>Einige scheinen ja alle Features von C++ zu kennen.<br />
Vielleicht kann auch jemand begründen, warum diese Operatoren nur als Methoden arbeiten?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/169866/implizite-typenumwandlung-aktivieren</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 21:21:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/169866.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Jan 2007 18:40:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implizite Typenumwandlung aktivieren. on Tue, 09 Jan 2007 18:40:55 GMT]]></title><description><![CDATA[<p>Gibt es eine Möglichkeit eine Typenumwandlung implizit zu ermöglichen?<br />
In etwa so:</p>
<pre><code class="language-cpp">class A
{
    // ... 
};
class B
{
    // ...
};

//  in etwa so (Konvertierungsoperator, funktioniert leider nur als nicht 
//  statische Methode einer Klasse)
operator A*(B* pB)
{
    // konvertiere B* nach A*, wie auch immer, z.B.:
    return reinterpret_cast&lt;A*&gt;(pB);
}
//  die Konvertierung zu einer Klasse kann man auch über einen ctor regeln, 
//  allerding sind Zeiger keine Klassen
//  auch der assign operator muss muss eine nicht-statische Methode einer Klasse sein
//  mir fällt keine weitere Möglichkeit ein, gibt es etwa keine? );
</code></pre>
<p>Einige scheinen ja alle Features von C++ zu kennen.<br />
Vielleicht kann auch jemand begründen, warum diese Operatoren nur als Methoden arbeiten?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206503</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Tue, 09 Jan 2007 18:40:55 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Typenumwandlung aktivieren. on Tue, 09 Jan 2007 19:04:44 GMT]]></title><description><![CDATA[<p>Die implizite Konvertierung von Zeigern zweier Klassen kannst du nur durch Vererbung ermöglichen (und dann auch nur in eine Richtung!).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206520</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Tue, 09 Jan 2007 19:04:44 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Typenumwandlung aktivieren. on Tue, 09 Jan 2007 19:54:03 GMT]]></title><description><![CDATA[<p>Dafür gibt es keine Möglichkeit (man denke aber auch an smartpointer <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="😉"
    /> )<br />
Der Grund dafür ist, dass die Sprachmittel zum Definieren neuer Typen und Überladen von Operatoren die Sprache nur erweitern aber nicht verändern sollen. Daher muss bei jeder Operatorenüberladung wenigstens ein Parameter ein UDT sein. Konversionsoperatoren nehmen in diesem Sinne noch eine Sonderrolle ein. Aber jedenfalls stehen die Konvertierungsregeln zwischen verschiedenen Pointern bereits fest - könnte man hier durch Konversionsoperatoren etwas machen, liefe das auf eine (nicht gewollte) veränderung hinaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206555</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 09 Jan 2007 19:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Implizite Typenumwandlung aktivieren. on Tue, 09 Jan 2007 23:32:37 GMT]]></title><description><![CDATA[<p>Hm, okay, das habe ich mir fast schon gedacht.<br />
Also, wenn ich eine Templateklasse habe,<br />
z.B.</p>
<pre><code class="language-cpp">template &lt;class T, int n, int m&gt;
class CMatrixT
{
public: // ganz viele funktionen zum arbeiten mit (n,m)-Matrizen

private:
    T    m_components[n][m];
};
</code></pre>
<p>und eine einfache C-Struktur:</p>
<pre><code class="language-cpp">struct C4x4Matrix
{
    float components[4][4];
};
</code></pre>
<p>dann habe ich ein Problem, bzw. plage mich ziehmlich mit reinterpret_cast's, die ziehmlich unschön sind. Die C-Struktur brauche ich für meine Schnittstelle, die template-Klasse verwende ich intern.<br />
Es soll jetzt also die template-Klasse von der C-Strukur abgeleitet werden, quasi eine Wrapper-Klasse.<br />
Dann könnte ich doch folgendes machen?</p>
<pre><code class="language-cpp">//	generate compile time error, if bAssumedTrue
template &lt;bool bAssumedTrue&gt; class CCompileTimeAssertT
{   int unused[bAssumedTrue ? 1 : -1];   };

template &lt;class T1, class T2&gt; 
void ProcCompileTimeAssertTypesRelated(T1&amp; t1, T2&amp; t2)
{
    T1&amp; p1 = static_cast&lt;T1&amp;&gt;(t2);
    T2&amp; p2 = static_cast&lt;T2&amp;&gt;(t1);
    p1; p2; t1; t2;
}

template &lt;class T1, class T2&gt; 
void ProcCompileTimeAssertTypesRelated(T1 t1[], T2 t2[])
{
    T1&amp; p1 = static_cast&lt;T1&amp;&gt;(t2[0]);
    T2&amp; p2 = static_cast&lt;T2&amp;&gt;(t1[0]);
    p1; p2; t1; t2;
}

template &lt;class T1, class T2&gt;
class _validateType
{
public:
    _validateType()
    {
        CCompileTimeAssertT&lt;sizeof(t1.value) == sizeof(t2.value)&gt;
            _Error_Base_value_has_wrong_size; _Error_Base_value_has_wrong_size;
        CCompileTimeAssertT&lt;sizeof(T1) == sizeof(T2)&gt;
            _Error_Base_has_wrong_size;       _Error_Base_has_wrong_size;
        ProcCompileTimeAssertTypesRelated(t1.value, t2.value);
    }

private:
	T1 t1;
	T2 t2;
};

//	Matrizen
template &lt;class T, int n, int m&gt;
struct CMatrixBaseT
{    T    value[n*m];	};

template &lt;class T, int n, int m, class Base = CMatrixBaseT&lt;T, n, m&gt; &gt;
class CMatrixT : public Base
{
public: // ganz viele funktionen zum arbeiten mit (n,m)-Matrizen
    CMatrixT()
    {   _validateType&lt;Base, CMatrixBaseT&lt;T, n, m&gt; &gt;	validate;  }
};

//	Skalare
template &lt;class T&gt;	struct CScalarBaseT
{    T value;	};

template &lt;class T, class Base = CScalarBaseT&lt;T&gt; &gt;
class CScalarT : public Base
{
public: // ganz viele funktionen zum arbeiten mit Skalaren
    CScalarT()
    {   _validateType&lt;Base, CScalarBaseT&lt;T&gt; &gt;	validate; }
};

extern &quot;C&quot;    //  C-Strukturen
{
struct Scalar
{   float	   value;        };

struct Matrix4x4
{   Scalar  value[4*4];   };
}

//	typedefs
typedef CScalarT&lt;float, Scalar&gt;               MeinScalar;
typedef CMatrixT&lt;MeinScalar, 2, 8, Matrix4x4&gt; MeineMatrix;

//	Verwendung
MeinScalar   x;
MeineMatrix  y;
Matrix4x4*   p1 = &amp;y;
MeineMatrix* p2 = static_cast&lt;MeineMatrix*&gt;(p1);
</code></pre>
<p>Dann ist die Konvertierung in die eine Richtung schonmal implizit. Allerdings tun sich jetzt Abründe auf:<br />
die Base muss einen member mit genau vorgegebener Größe haben und mit genau festgelegtem Typ. Das ganze wird abgesichert, würde also bereits zur Compilierzeit als Murks entarnt werden können.<br />
Ein paar einfache Konvertierungen kann man da jetzt ja einbauen, allerdings muss ich von C4x4Matrix* nach MeineMatrix* einen static_cast verwenden.<br />
Gibt es dafür eine elegantere Lösung?<br />
Oder sonstige Anregungen. Die _validateType Klasse erscheint mir auch im Zwielicht, denn ihr konstruktor wird aufgerufen. (der Compiler _kann_ das optimieren, allerdings testet man Programme auch gern ohne Optimierungen.</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1206716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1206716</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Tue, 09 Jan 2007 23:32:37 GMT</pubDate></item></channel></rss>