<?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[Methodenzeiger als Template-Argument - Defaultwerte]]></title><description><![CDATA[<p>Hallo da!<br />
Schön, dass ihr wieder da seid.</p>
<p>Vielleicht erinnert ihr euch noch an diesen Thread, ich konnte jetzt den Umstand ausnutzen, dass VC++ beim letzten Argument doch den nullptr als default akzeptiert. Zusammen mit decltype sieht das jetzt mMn sehr schön aus, mal davon ab, dass Intellisense darauf abraucht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt; typename ValueType, typename ClassType, ValueType(ClassType::*Getter)() const = nullptr &gt;
struct getter {
	static ValueType get(const ClassType* this_)
	{
		return (this_-&gt;*Getter)();
	}

	static bool is_null() {
		return Getter == nullptr;
	}
};

template&lt; typename ValueType, typename ClassType, void(ClassType::*Setter)(ValueType) = nullptr &gt;
struct setter {
	template&lt; typename ValInType &gt;
	static void set(ClassType* this_, ValInType&amp;&amp; val)
	{
		(this_-&gt;*Setter)(std::forward&lt;ValInType&gt;(val));
	}

	static bool is_null() {
		return Setter == nullptr;
	}
};

template&lt; typename ValueType, typename ClassType, bool(ClassType::*Validator)(ValueType) const = nullptr &gt;
struct validator {
	static bool validate(const ClassType* this_, const ValueType&amp; val) {
		if (!is_null()) {
			return (this_-&gt;*Validator)(val);
		}
		else {
			return true;
		}
	}

	static bool is_null() {
		return Validator == nullptr;
	}
};

template&lt; typename ValueType, typename ClassType, void(ClassType::*Options)() = nullptr &gt;
struct options {
	static void option()
	{}
};

template &lt; typename ValueType, typename ClassType,
	typename Getter,
	typename Setter = setter&lt;ValueType,ClassType&gt;,
	typename Validator = validator&lt;ValueType,ClassType&gt;,
	typename Options = options&lt;ValueType,ClassType&gt;
&gt;
struct StaticProperty
{

	ValueType get(const ClassType* this_) {
		return Getter::get(this_);
	}

	template &lt; typename ValTypeIn &gt;
	void set(ClassType* this_, ValTypeIn&amp;&amp; val)
	{
		Setter::set(this_, std::forward&lt;ValTypeIn&gt;(val));
	}

	template &lt; typename ValTypeIn &gt;
	void validate(ClassType* this_, ValTypeIn&amp;&amp; val)
	{
		Validator::validate(this_, std::forward&lt;ValTypeIn&gt;(val));
	}
private:

};

template&lt; typename... Types &gt;
struct type_list
{};

template&lt; typename Ret, typename Class, typename... Args &gt;
struct method_types {
	using ret_type = Ret;
	using class_type = Class;
	using arg_types = type_list&lt;Args...&gt;;
};

template&lt; typename ClassType, typename Ret, typename... Args &gt;
method_types&lt;Ret, ClassType, Args...&gt; deduce(Ret(ClassType::*arg)(Args...) const);

#define StaticPropertyR(Getter) \
	StaticProperty&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, \
		getter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Getter &gt; \
	&gt;

#define StaticPropertyRS(Getter,Setter) \
	StaticProperty&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, \
		getter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Getter &gt;, \
		setter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Setter &gt; \
	&gt;

#define StaticPropertyRSV(Getter,Setter,Validator) \
	StaticProperty&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, \
		getter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Getter &gt;, \
		setter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Setter &gt;, \
		validator&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Validator &gt; \
	&gt;

struct test_class {
	test_class() {
	}

	int get_property() const {
		return value_;
	}

	void set_property(int value) {
		value_ = value;
	}

	bool validate(int value) const {
		return true;
	}

private:
	int value_;
};

StaticPropertyR(&amp;test_class::get_property) my_prop;
StaticPropertyRS(&amp;test_class::get_property, &amp;test_class::set_property) my_prop2;
StaticPropertyRSV(&amp;test_class::get_property, &amp;test_class::set_property, &amp;test_class::validate) my_prop3;

int main()
{
	test_class test;

	my_prop3.set(&amp;test, 4);
	std::cout &lt;&lt; my_prop3.get(&amp;test);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/321334/methodenzeiger-als-template-argument-defaultwerte</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 00:06:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321334.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 08 Nov 2013 11:15:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Methodenzeiger als Template-Argument - Defaultwerte on Fri, 08 Nov 2013 11:15:42 GMT]]></title><description><![CDATA[<p>Hallo da!<br />
Schön, dass ihr wieder da seid.</p>
<p>Vielleicht erinnert ihr euch noch an diesen Thread, ich konnte jetzt den Umstand ausnutzen, dass VC++ beim letzten Argument doch den nullptr als default akzeptiert. Zusammen mit decltype sieht das jetzt mMn sehr schön aus, mal davon ab, dass Intellisense darauf abraucht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt; typename ValueType, typename ClassType, ValueType(ClassType::*Getter)() const = nullptr &gt;
struct getter {
	static ValueType get(const ClassType* this_)
	{
		return (this_-&gt;*Getter)();
	}

	static bool is_null() {
		return Getter == nullptr;
	}
};

template&lt; typename ValueType, typename ClassType, void(ClassType::*Setter)(ValueType) = nullptr &gt;
struct setter {
	template&lt; typename ValInType &gt;
	static void set(ClassType* this_, ValInType&amp;&amp; val)
	{
		(this_-&gt;*Setter)(std::forward&lt;ValInType&gt;(val));
	}

	static bool is_null() {
		return Setter == nullptr;
	}
};

template&lt; typename ValueType, typename ClassType, bool(ClassType::*Validator)(ValueType) const = nullptr &gt;
struct validator {
	static bool validate(const ClassType* this_, const ValueType&amp; val) {
		if (!is_null()) {
			return (this_-&gt;*Validator)(val);
		}
		else {
			return true;
		}
	}

	static bool is_null() {
		return Validator == nullptr;
	}
};

template&lt; typename ValueType, typename ClassType, void(ClassType::*Options)() = nullptr &gt;
struct options {
	static void option()
	{}
};

template &lt; typename ValueType, typename ClassType,
	typename Getter,
	typename Setter = setter&lt;ValueType,ClassType&gt;,
	typename Validator = validator&lt;ValueType,ClassType&gt;,
	typename Options = options&lt;ValueType,ClassType&gt;
&gt;
struct StaticProperty
{

	ValueType get(const ClassType* this_) {
		return Getter::get(this_);
	}

	template &lt; typename ValTypeIn &gt;
	void set(ClassType* this_, ValTypeIn&amp;&amp; val)
	{
		Setter::set(this_, std::forward&lt;ValTypeIn&gt;(val));
	}

	template &lt; typename ValTypeIn &gt;
	void validate(ClassType* this_, ValTypeIn&amp;&amp; val)
	{
		Validator::validate(this_, std::forward&lt;ValTypeIn&gt;(val));
	}
private:

};

template&lt; typename... Types &gt;
struct type_list
{};

template&lt; typename Ret, typename Class, typename... Args &gt;
struct method_types {
	using ret_type = Ret;
	using class_type = Class;
	using arg_types = type_list&lt;Args...&gt;;
};

template&lt; typename ClassType, typename Ret, typename... Args &gt;
method_types&lt;Ret, ClassType, Args...&gt; deduce(Ret(ClassType::*arg)(Args...) const);

#define StaticPropertyR(Getter) \
	StaticProperty&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, \
		getter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Getter &gt; \
	&gt;

#define StaticPropertyRS(Getter,Setter) \
	StaticProperty&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, \
		getter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Getter &gt;, \
		setter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Setter &gt; \
	&gt;

#define StaticPropertyRSV(Getter,Setter,Validator) \
	StaticProperty&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, \
		getter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Getter &gt;, \
		setter&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Setter &gt;, \
		validator&lt; typename decltype(deduce(Getter))::ret_type, typename decltype(deduce(Getter))::class_type, Validator &gt; \
	&gt;

struct test_class {
	test_class() {
	}

	int get_property() const {
		return value_;
	}

	void set_property(int value) {
		value_ = value;
	}

	bool validate(int value) const {
		return true;
	}

private:
	int value_;
};

StaticPropertyR(&amp;test_class::get_property) my_prop;
StaticPropertyRS(&amp;test_class::get_property, &amp;test_class::set_property) my_prop2;
StaticPropertyRSV(&amp;test_class::get_property, &amp;test_class::set_property, &amp;test_class::validate) my_prop3;

int main()
{
	test_class test;

	my_prop3.set(&amp;test, 4);
	std::cout &lt;&lt; my_prop3.get(&amp;test);

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2364297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2364297</guid><dc:creator><![CDATA[Aufgeschmissener]]></dc:creator><pubDate>Fri, 08 Nov 2013 11:15:42 GMT</pubDate></item></channel></rss>