<?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[Strikte Typdefinition]]></title><description><![CDATA[<p>Hallo,</p>
<p>mir ist folgendes aufgefallen:</p>
<p>typedef int my_int;</p>
<p>Ich kann my_int überall dort übergeben, wo ein int erwartet wird. Gibt es eine Möglichkeit dass zu unterbinden? Ich würde gerne,dass ich nicht um einen cast herumkomme.</p>
<p>Danke euch! <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>
<p>Bye, donnerCobra</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259446/strikte-typdefinition</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 19:42:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259446.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 23 Jan 2010 10:05:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Strikte Typdefinition on Sat, 23 Jan 2010 10:05:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mir ist folgendes aufgefallen:</p>
<p>typedef int my_int;</p>
<p>Ich kann my_int überall dort übergeben, wo ein int erwartet wird. Gibt es eine Möglichkeit dass zu unterbinden? Ich würde gerne,dass ich nicht um einen cast herumkomme.</p>
<p>Danke euch! <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>
<p>Bye, donnerCobra</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843591</guid><dc:creator><![CDATA[DonnerCobra]]></dc:creator><pubDate>Sat, 23 Jan 2010 10:05:42 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Sat, 23 Jan 2010 10:15:37 GMT]]></title><description><![CDATA[<p><code>typedef</code> erstellt nur ein Synonym. Der Typ bleibt gleich. Wenn du einen neuen Typ willst, dann kommst du um <code>class</code> oder <code>struct</code> nicht herum.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843593</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 23 Jan 2010 10:15:37 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Sat, 23 Jan 2010 10:41:51 GMT]]></title><description><![CDATA[<p>Dafür nutze ich immer eine Wrapper-Klasse:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; class wrapper
{
public:
	explicit wrapper(T t)
		: _t(t)
	{}

	operator T() const { return _t; }

private:
	T _t;
};
</code></pre>
<p>Benutzung dann so:</p>
<pre><code class="language-cpp">typedef wrapper&lt;int&gt; my_int;

my_int x = my_int(42);
// 
int y = x;
</code></pre>
<p>Wenn du letzteres unterbinden willst, dann einfach den Operator entfernen und dafür dann z.B. eine Methode &quot;cast()&quot; anbieten.</p>
<p>Wenn du jedoch Zuweisungen der Art</p>
<pre><code class="language-cpp">typedef int my_int;
typedef int my_int2;

my_int x;
my_int2 y;

x = y; // &lt;-- dies unterbinden?
</code></pre>
<p>verbieten willst (d.h. Compiler-Fehler), dann kann ich dir eine andere Klasse anbieten, die nur im TEST-Modus Fehler wirft (wenn du obige Wrapper-Klasse nicht verwenden willst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843605</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 23 Jan 2010 10:41:51 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Sat, 23 Jan 2010 11:15:51 GMT]]></title><description><![CDATA[<p>Super, vielen Dank!</p>
<p>Zur Wrapperklasse: ist dies aufgrund des Wrappers (ok, ein bisschen Overhead) langsamer als der reine Datentyp?</p>
<p>@ Th69 Wenn du mir die eine Klasse zur Verfügung stellen könntest, wäre das super.</p>
<p>Bye, donnerCobra</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843620</guid><dc:creator><![CDATA[DonnerCobra]]></dc:creator><pubDate>Sat, 23 Jan 2010 11:15:51 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Sat, 23 Jan 2010 12:50:39 GMT]]></title><description><![CDATA[<p>Nein, das sollte im Release-Mode eigentlich alles inline ausgeführt werden (ist also nur syntaktischer Overhead).</p>
<p>Und hier noch meine Header-Datei 'type.h' mit der Klasse 'type':</p>
<pre><code class="language-cpp">#ifndef TYPE_H
#define TYPE_H

#ifdef TEST_TYPE

template&lt;typename T, class NAME&gt; class type
{
public:
	typedef type&lt;T, NAME&gt; THIS;

	type() {}
	type(const THIS&amp; t) { x = t.x; }
	type(const T&amp; _t) { x = _t; }

//	operator T() const { return x; }
	T value() const { return x; }
	template&lt;class U&gt; U cast() const { return (U)x; }

	THIS&amp; operator  = (const THIS&amp; t) { x  = t.x; return *this; }
	THIS&amp; operator *= (const THIS&amp; t) { x *= t.x; return *this; }
	THIS&amp; operator /= (const THIS&amp; t) { x /= t.x; return *this; }
	THIS&amp; operator %= (const THIS&amp; t) { x %= t.x; return *this; }
	THIS&amp; operator += (const THIS&amp; t) { x += t.x; return *this; }
	THIS&amp; operator -= (const THIS&amp; t) { x -= t.x; return *this; }
	THIS&amp; operator &lt;&lt;=(const THIS&amp; t) { x &lt;&lt;= t.x; return *this; }
	THIS&amp; operator &gt;&gt;=(const THIS&amp; t) { x &gt;&gt;= t.x; return *this; }
	THIS&amp; operator &amp;= (const THIS&amp; t) { x &amp;= t.x; return *this; }
	THIS&amp; operator |= (const THIS&amp; t) { x |= t.x; return *this; }
	THIS&amp; operator ^= (const THIS&amp; t) { x ~= t.x; return *this; }

	const THIS&amp; operator ++ () { ++x; return *this; }
	const THIS&amp; operator -- () { --x; return *this }
	THIS operator ++ (int) { THIS t = *this; ++x; return t; }
	THIS operator -- (int) { THIS t = *this; --x; return t; }

	bool operator ==(const THIS&amp; t) const { return x == t.x; }
	bool operator !=(const THIS&amp; t) const { return x != t.x; }
	bool operator &lt; (const THIS&amp; t) const { return x &lt;  t.x; }
	bool operator &lt;=(const THIS&amp; t) const { return x &lt;= t.x; }
	bool operator &gt; (const THIS&amp; t) const { return x &gt;  t.x; }
	bool operator &gt;=(const THIS&amp; t) const { return x &gt;= t.x; }

	THIS operator * (const THIS&amp; t) const { return THIS(x * t.x); }
	THIS operator / (const THIS&amp; t) const { return THIS(x / t.x); }
	THIS operator % (const THIS&amp; t) const { return THIS(x % t.x); }
	THIS operator + (const THIS&amp; t) const { return THIS(x + t.x); }
	THIS operator - (const THIS&amp; t) const { return THIS(x - t.x); }
	THIS operator &lt;&lt;(const THIS&amp; t) const { return THIS(x &lt;&lt; t.x); }
	THIS operator &gt;&gt;(const THIS&amp; t) const { return THIS(x &gt;&gt; t.x); }
	THIS operator &amp; (const THIS&amp; t) const { return THIS(x &amp; t.x); }
	THIS operator | (const THIS&amp; t) const { return THIS(x | t.x); }
	THIS operator ^ (const THIS&amp; t) const { return THIS(x ^ t.x); }
	THIS operator + () const { return THIS( x); }
	THIS operator - () const { return THIS(-x); }
	THIS operator ! () const { return THIS(!x); }
	THIS operator ~ () const { return THIS(~x); }

	friend bool operator ==(const T&amp; _t, const THIS&amp; t) { return _t == t.x; }
	friend bool operator !=(const T&amp; _t, const THIS&amp; t) { return _t != t.x; }
	friend bool operator &lt; (const T&amp; _t, const THIS&amp; t) { return _t &lt;  t.x; }
	friend bool operator &lt;=(const T&amp; _t, const THIS&amp; t) { return _t &lt;= t.x; }
	friend bool operator &gt; (const T&amp; _t, const THIS&amp; t) { return _t &gt;  t.x; }
	friend bool operator &gt;=(const T&amp; _t, const THIS&amp; t) { return _t &gt;= t.x; }

	friend THIS operator * (const T&amp; _t, const THIS&amp; t) { return THIS(_t * t.x); }
	friend THIS operator / (const T&amp; _t, const THIS&amp; t) { return THIS(_t / t.x); }
	friend THIS operator % (const T&amp; _t, const THIS&amp; t) { return THIS(_t % t.x); }
	friend THIS operator + (const T&amp; _t, const THIS&amp; t) { return THIS(_t + t.x); }
	friend THIS operator - (const T&amp; _t, const THIS&amp; t) { return THIS(_t - t.x); }
	friend THIS operator &lt;&lt;(const T&amp; _t, const THIS&amp; t) { return THIS(_t &lt;&lt; t.x); }
	friend THIS operator &gt;&gt;(const T&amp; _t, const THIS&amp; t) { return THIS(_t &gt;&gt; t.x); }
	friend THIS operator &amp; (const T&amp; _t, const THIS&amp; t) { return THIS(_t &amp; t.x); }
	friend THIS operator | (const T&amp; _t, const THIS&amp; t) { return THIS(_t | t.x); }
	friend THIS operator ^ (const T&amp; _t, const THIS&amp; t) { return THIS(_t ^ t.x); }

private:
	T x;
};

#define TYPEDEF(T, NAME)\
	struct _S_##NAME\
	{\
		static const char * const name() { return #NAME; }\
	};\
	typedef type&lt;T, _S_##NAME&gt; NAME;\
	/* partial template */\
	template&lt;class U&gt; U CAST(const NAME&amp; t)\
	{\
		return U(t.value()); /* t.template cast&lt;U&gt;(); */\
	}

#else

#define TYPEDEF(T, NAME)\
	typedef T NAME;

template&lt;class U, class T&gt; U CAST(const T&amp; t)
{
	return U(t);
};

#endif

#endif
</code></pre>
<p>Damit kannst du verschiedene typedefs voneinander trennen, obwohl sie auf demselben Datentyp beruhen.<br />
Hier meine Testfunktion dazu:</p>
<pre><code class="language-cpp">#define TEST_TYPE
#include &quot;type.h&quot;

TYPEDEF(int, ID);
TYPEDEF(int, INDEX);

static INDEX st_idx[] = { 0, 10, 5, 3, 2, 1 };

void test_type()
{
	ID id = 42;
	INDEX index = 101;
	INDEX index2 = st_idx[0];

	id *= 4;
	id = 10 - id;
	ID id2 = id++;
	id = -id2;
	id2 -= id;
	id = 2 * (id2 + 5);

	if(id2 != 0)
		id2 = -1;

	if(0 &gt; id2)
		id2 = id - 100;

	if(id == id2)
		++id2;

	ID *pId = &amp;id;
	*pId = 5;

	id2 = *pId;

//  errors! --&gt; good!
/*	id = index;
	id *= index;
	ID id3 = index;
	ID id4(index);
	if(id == index)
		index = 5 + id;
*/
	// with explicit casting --&gt; OK
	if(CAST&lt;INDEX&gt;(id) == index)
		id += CAST&lt;ID&gt;(index);

	int i = CAST&lt;int&gt;(id);
	i = i;
	unsigned short us = CAST&lt;unsigned short&gt;(id);
	us = us;
}
</code></pre>
<p>Du brauchst dann einfach z.B. im Debug-Modus das '#define TEST_TYPE' aktivieren - und im Release-Mode dann normal kompilieren (um nicht den unnötigen Overhead der internen Klasseninstanzen für das template 'class &lt;...&gt; type' zu haben.<br />
Du mußt dazu dann allerdings statt</p>
<pre><code class="language-cpp">typedef int my_int;
</code></pre>
<p>dann immer das define</p>
<pre><code class="language-cpp">TYPEDEF(int, my_int);
</code></pre>
<p>benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843677</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 23 Jan 2010 12:50:39 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Sat, 23 Jan 2010 13:33:21 GMT]]></title><description><![CDATA[<p>selbst mittels präprozessor könnte man das hübscher machen... die richtige wahl wäre hier aber(wie der name des makros schon sagt :P) ein einfaches typedef...<br />
den name halte ich für sinnlos...</p>
<pre><code class="language-cpp">/* wrapper.h */
namespace detail
{
  template&lt;typename T&gt;
  struct foo
  {
    /*...*/
  };
}

#if defined(NDEBUG)
  template&lt;typename T&gt;
  struct wrapper
  {
    typedef detail::foo&lt;T&gt; type;
  };
#else
  template&lt;typename T&gt;
  struct wrapper
  {
    typedef T type;
  };
#endif
</code></pre>
<p>oder aber</p>
<pre><code class="language-cpp">/* wrapper.h */
template&lt;typename T&gt;
struct wrapper
{
  /*...*/

# if defined(NDEBUG)
    typedef wrapper type;
# else
    typedef T type;
# endif
};
</code></pre>
<p>in beiden fällen würde das so einfach und intuitiv zu nutzen gehen:</p>
<pre><code class="language-cpp">/* main.cpp */

typedef wrapper&lt;int&gt;::type id_t;

int main()
{
  id_t id(100);
}
</code></pre>
<p>zurück zu deinem code:<br />
<code>typedef type&lt;T, NAME&gt; THIS;</code><br />
1. ist THIS nen doofer name für nen typen - wenn überhaupt <code>this_type</code> oder so.<br />
2. ist die explizite angabe der template-argumente gar nicht nötig. ein einfaches <code>typedef type this_type;</code> würde da reichen.</p>
<p><code>const T&amp; _t, const THIS&amp; t</code><br />
wieso nicht lhs und rhs, wie das jeder macht sondern ein _t und t? Oo</p>
<p>wenn die typtrennung strikt sein soll, wieso dann <code>// operator T() const { return x; }</code> ?<br />
dann schreib doch im private-teil einfach noch <code>operator T() const;</code></p>
<p><code>template&lt;class U&gt; U cast() const { return (U)x; }</code><br />
hier sollte man aber echt mit c++ casts arbeiten</p>
<p>ich nehm mal an, dass es einen grund gibt, wieso man alle operatoren als friend und nicht friend implementiert, obwohl man eh nicht <code>id.operator==(other_id)</code> schreiben kann, gibt!?</p>
<p><code>THIS operator + () const { return THIS( x); }</code><br />
das hier ist aber echt fail</p>
<p>eigtl würd ich alle operatoren als template anbieten...<br />
die streaming-operatoren hast du auch nicht überladen...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1843703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1843703</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 23 Jan 2010 13:33:21 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Sun, 24 Jan 2010 17:48:08 GMT]]></title><description><![CDATA[<p>Hallo unskilled,</p>
<p>bei meiner 'type.h' geht es darum, daß z.B. zwei typedef-ints eben nicht als gleich gelten sollen, d.h. bei deinem Wrapper ist</p>
<pre><code class="language-cpp">typedef wrapper&lt;int&gt;::type id_t;
typedef wrapper&lt;int&gt;::type index_t;

int main()
{
  id_t id(100);
  index_t index(42);

  id = index; // &lt;-- kein Compiler-Fehler!
}
</code></pre>
<p>möglich, und bei meiner Type-Klasse eben nicht!</p>
<p>Und bzgl. meines Codes:<br />
diesen habe ich vor ca. 7 Jahren auf einem älteren MSVC compilieren müssen, daher auch einige unschöne Dinge...</p>
<p>Meine eigentliche 'type.h' sieht heute auch etwas anders aus...</p>
<p>Aber du darfst sie gerne nach deinen Wünschen aufpolieren und bei boost einreichen -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844130</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 24 Jan 2010 17:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Sun, 24 Jan 2010 19:02:01 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Hallo unskilled,</p>
<p>bei meiner 'type.h' geht es darum, daß z.B. zwei typedef-ints eben nicht als gleich gelten sollen, d.h. bei deinem Wrapper ist</p>
</blockquote>
<p>das hatte ich schon verstanden <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>
<p>myself schrieb:</p>
<blockquote>
<p>wenn die typtrennung strikt sein soll, wieso dann // operator T() const { return x; } ?<br />
dann schreib doch im private-teil einfach noch operator T() const;</p>
</blockquote>
<p>;o)</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844185</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sun, 24 Jan 2010 19:02:01 GMT</pubDate></item><item><title><![CDATA[Reply to Strikte Typdefinition on Mon, 25 Jan 2010 10:33:32 GMT]]></title><description><![CDATA[<p>Welchen Zweck soll denn der Datentyp haben, vielleicht ist es ja mit einer einfachen enum auch getan?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1844424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1844424</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 25 Jan 2010 10:33:32 GMT</pubDate></item></channel></rss>