<?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[dynamisches static_assert]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir mit Lambdas eine Property Klasse gebastelt. Um eine ReadOnly Property zu haben, lässt man einfach den Setter weg. Bisher prüfe ich nun im = operator ob der Setter 0 ist und werfe, falls ja, eine Exception. Nun frage ich mich, ob sich das ganze auch schon zur Compiletime lösen lässt. static_assert kann ich dazu aber nicht verwenden, weil der Ausdruck nur einmal ausgewertet wird. Der Compiler müsste für mich aber jeden Aufruf des =operators getrennt auswerten.<br />
Gibts es einen Kniff, damit auch sowas möglich ist?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/294834/dynamisches-static_assert</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 17:16:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/294834.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Nov 2011 10:04:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 10:04:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir mit Lambdas eine Property Klasse gebastelt. Um eine ReadOnly Property zu haben, lässt man einfach den Setter weg. Bisher prüfe ich nun im = operator ob der Setter 0 ist und werfe, falls ja, eine Exception. Nun frage ich mich, ob sich das ganze auch schon zur Compiletime lösen lässt. static_assert kann ich dazu aber nicht verwenden, weil der Ausdruck nur einmal ausgewertet wird. Der Compiler müsste für mich aber jeden Aufruf des =operators getrennt auswerten.<br />
Gibts es einen Kniff, damit auch sowas möglich ist?</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139214</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 10:09:23 GMT]]></title><description><![CDATA[<p>Ohne Code nix los.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139218</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:09:23 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 10:12:32 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template&lt;typename ValueType&gt;
class Property
{
public:
	Property()
	{

	}
	//---------------------------------------------------------------------------
	Property(const std::function&lt;ValueType()&gt; &amp;get, const std::function&lt;void(ValueType)&gt; &amp;set)
	{
		this-&gt;get = get;
		this-&gt;set = set;
	}
	//---------------------------------------------------------------------------
	ValueType operator = (const ValueType&amp; value)
	{
		if (!set)
		{
			throw 1; //hier
		}

		set(value);

		return value;
	}
	//---------------------------------------------------------------------------
	operator ValueType()
	{
		if (!get)
		{
			throw 1; //und hier
		}

		return get();
	}
	//---------------------------------------------------------------------------

private:
	std::function&lt;ValueType()&gt; get;
	std::function&lt;void(ValueType)&gt; set;
};
</code></pre>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139220</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 10:54:41 GMT]]></title><description><![CDATA[<p>Wo soll denn der Setter hinsetten? Und woraus soll der Getter lesen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139237</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:54:41 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 10:59:35 GMT]]></title><description><![CDATA[<p>Irgendwie anders mit Templatespezialisierung vielleicht?<br />
So:</p>
<pre><code class="language-cpp">template&lt;typename ValueType&gt;
class write_extend
{
public:
    typedef ValueType type;
    typedef std::function&lt;void (type)&gt; setter_functor;

    write_extend(setter_functor const &amp; setter) : m_setter(setter) {}

    type operator = (type const &amp; value)
    {
        m_setter(value);
        return value;
    }

private:
    setter_functor m_setter;
};

template&lt;typename ValueType&gt;
class read_extend
{
public:
    typedef ValueType type;
    typedef std::function&lt;type ()&gt; getter_functor;

    explicit read_extend(getter_functor const &amp; getter)
    : m_getter(getter)
    { }

    operator type()
    {
        return m_getter();
    }

private:
    getter_functor m_getter;
};

struct read_only_property{};
struct read_write_property{};

template&lt;typename ValueType, typename AccessTag = read_write_property&gt;
class property;

template&lt;typename ValueType&gt;
class property&lt;ValueType, read_write_property&gt; 
    : public read_extend&lt;ValueType&gt;
    , public write_extend&lt;ValueType&gt;
{
    typedef read_extend&lt;ValueType&gt; read_base;
    typedef write_extend&lt;ValueType&gt; write_base;
public:
    property(getter_functor const &amp; getter, setter_functor const &amp; setter)
    : read_base(getter)
    , write_base(setter)
    { }
    using read_base::operator read_base::type;
    using write_base::operator=;
};

template&lt;typename ValueType&gt;
class property&lt;ValueType, read_only_property&gt; 
    : public read_extend&lt;ValueType&gt;
{
    typedef read_extend&lt;ValueType&gt; read_base;
public:
    property(getter_functor const &amp; getter)
    : read_base(getter)
    { }
    using read_base::operator read_base::type;
};

//Benutzung:
//hat nur setter und kann nur gelesen werden
property&lt;int, read_only_property&gt; p1(&amp;get_fct);
//compile fehler: kein setter setzbar
property&lt;int, read_only_property&gt; p2(&amp;get_fct, &amp;set_fct);

//lesen und schreiben erlaubt
property&lt;int&gt; p3(&amp;get_fct, &amp;set_fct);

//compile fehler: p1 hat kein operator=
p1 = 42;
//okay
std::cout &lt;&lt; p1 &lt;&lt; std::endl;

//okay
p3 = 42;
//okay
std::cout &lt;&lt; p3 &lt;&lt; std::endl;
</code></pre>
<p>Ob das ganze überhaupt sinnvoll ist, sei mal dahingestellt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139244</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Nov 2011 10:59:35 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 14:05:14 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wo soll denn der Setter hinsetten? Und woraus soll der Getter lesen?</p>
</blockquote>
<p>dazu übergibt man ja den entsprechenden Getter bzw Setter.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: ok, das wäre ein Möglichkeit, danke</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139354</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Wed, 02 Nov 2011 14:05:14 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 16:37:44 GMT]]></title><description><![CDATA[<p>Wie wäre es ganz banal mit einer <code>ReadOnlyProperty</code> Klasse?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139434</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 02 Nov 2011 16:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 16:53:43 GMT]]></title><description><![CDATA[<p>geht natürlich, eine &quot;ist ReadOnly&quot; Meldung beim Compilieren hätte mir persönlich allerdings besser gefallen.</p>
<p>greetz KN4CK3R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139441</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Wed, 02 Nov 2011 16:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Wed, 02 Nov 2011 17:54:27 GMT]]></title><description><![CDATA[<p>KN4CK3R schrieb:</p>
<blockquote>
<p>geht natürlich, eine &quot;ist ReadOnly&quot; Meldung beim Compilieren hätte mir persönlich allerdings besser gefallen.</p>
</blockquote>
<pre><code class="language-cpp">class read_only_property
{
public:
  read_only_property&amp; operator =(int value)
  {
    static_assert(false, &quot;property is readonly&quot;);
  }
};

int main()
{
  read_only_property p;

  p = 10;

  return 0;
}
</code></pre>
<p>Noch ein Wunsch?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2139467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139467</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 02 Nov 2011 17:54:27 GMT</pubDate></item><item><title><![CDATA[Reply to dynamisches static_assert on Thu, 03 Nov 2011 10:11:59 GMT]]></title><description><![CDATA[<p>nein, passt <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/2139719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2139719</guid><dc:creator><![CDATA[KN4CK3R]]></dc:creator><pubDate>Thu, 03 Nov 2011 10:11:59 GMT</pubDate></item></channel></rss>