digitalmars.D.learn - Define methods using templates
- Claude (32/32) Dec 30 2014 Hello, I'm trying to use templates to define several methods
- Steven Schveighoffer (14/40) Dec 30 2014 I think it has to do with the fact that when you are defining the
- Steven Schveighoffer (10/22) Dec 30 2014 A possibly more elegant solution, use opDispatch:
- Daniel =?UTF-8?B?S296w6Fr?= via Digitalmars-d-learn (29/69) Dec 30 2014 V Tue, 30 Dec 2014 13:17:08 +0000
- Claude (8/17) Dec 30 2014 I tested both the "string mixin" and "opAssign" implementations,
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (5/7) Dec 30 2014 I just saw this post, which is essentially the same question as Basile
- Claude (8/11) Jan 08 2015 Maybe using templates to create properties is a bit overkill in
Hello, I'm trying to use templates to define several methods
(property setters) within a class to avoid some code duplication.
Here is an attempt:
class Camera
{
private:
Vector4 m_pos;
float m_fov, m_ratio, m_near, m_far;
bool m_matrixCalculated;
public:
void SetProperty(Tin, alias Field)(ref Tin param) property
pure safe
{
Field = param;
m_matrixCalculated = false;
}
alias pos = SetProperty!(float[], m_pos);
alias pos = SetProperty!(Vector4, m_pos);
alias ratio = SetProperty!(float, m_ratio);
alias near = SetProperty!(float, m_near);
alias far = SetProperty!(float, m_far);
}
I get this kind of compilation error:
Error: template instance SetProperty!(float[], m_pos) cannot use
local 'm_pos' as parameter to non-global template
SetProperty(Tin, alias Field)(ref Tin param)
I don't understand why that error occurs.
And I cannot find any elegant solutions (even with mixin's) to
declare a template and then instantiate it in a single line to
define the methods I want.
Does any of you have an idea?
Thanks
Dec 30 2014
On 12/30/14 8:17 AM, Claude wrote:
Hello, I'm trying to use templates to define several methods (property
setters) within a class to avoid some code duplication.
Here is an attempt:
class Camera
{
private:
Vector4 m_pos;
float m_fov, m_ratio, m_near, m_far;
bool m_matrixCalculated;
public:
void SetProperty(Tin, alias Field)(ref Tin param) property pure safe
{
Field = param;
m_matrixCalculated = false;
}
alias pos = SetProperty!(float[], m_pos);
alias pos = SetProperty!(Vector4, m_pos);
alias ratio = SetProperty!(float, m_ratio);
alias near = SetProperty!(float, m_near);
alias far = SetProperty!(float, m_far);
}
I get this kind of compilation error:
Error: template instance SetProperty!(float[], m_pos) cannot use local
'm_pos' as parameter to non-global template SetProperty(Tin, alias
Field)(ref Tin param)
I don't understand why that error occurs.
I think it has to do with the fact that when you are defining the
aliases, m_pos for example, is an *instance* member so requires an
instance to get an alias.
What you are probably better off doing is:
void SetProperty(Tin, string Field)(ref Tin param) property pure safe
{
mixin(Field ~ " = param;");
m_matrixCalculated = false;
}
alias pos = SetProperty!(float[], "m_pos");
I would also put some strict template constraints on the Field string
too, because one abuse SetProperty pretty easily there.
-Steve
Dec 30 2014
On 12/30/14 8:48 AM, Steven Schveighoffer wrote:
I think it has to do with the fact that when you are defining the
aliases, m_pos for example, is an *instance* member so requires an
instance to get an alias.
What you are probably better off doing is:
void SetProperty(Tin, string Field)(ref Tin param) property pure safe
{
mixin(Field ~ " = param;");
m_matrixCalculated = false;
}
alias pos = SetProperty!(float[], "m_pos");
I would also put some strict template constraints on the Field string
too, because one abuse SetProperty pretty easily there.
A possibly more elegant solution, use opDispatch:
void opDispatch(string Field, Tin)(ref Tin param) property pure safe
if(Field == "pos" || Field == "ratio" || ...)
{
mixin("m_" ~ Field ~ " = param;");
m_matrixCalculated = false;
}
Not sure if opDispatch works as a property this way...
-Steve
Dec 30 2014
V Tue, 30 Dec 2014 13:17:08 +0000 Claude via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> napsáno:Hello, I'm trying to use templates to define several methods (property setters) within a class to avoid some code duplication. Here is an attempt: class Camera { private: Vector4 m_pos; float m_fov, m_ratio, m_near, m_far; bool m_matrixCalculated; public: void SetProperty(Tin, alias Field)(ref Tin param) property pure safe { Field = param; m_matrixCalculated = false; } alias pos = SetProperty!(float[], m_pos); alias pos = SetProperty!(Vector4, m_pos); alias ratio = SetProperty!(float, m_ratio); alias near = SetProperty!(float, m_near); alias far = SetProperty!(float, m_far); } I get this kind of compilation error: Error: template instance SetProperty!(float[], m_pos) cannot use local 'm_pos' as parameter to non-global template SetProperty(Tin, alias Field)(ref Tin param) I don't understand why that error occurs. And I cannot find any elegant solutions (even with mixin's) to declare a template and then instantiate it in a single line to define the methods I want. Does any of you have an idea?Thanksclass Camera { private: int m_pos; float m_fov, m_ratio, m_near, m_far; bool m_matrixCalculated; public: mixin template opAssign(alias Field) { void opAssign(Tin)(auto ref Tin param) property pure safe { Field = param; m_matrixCalculated = false; } } mixin opAssign!(m_pos) pos; mixin opAssign!(m_fov) fov; mixin opAssign!(m_ratio) ratio; mixin opAssign!(m_near) near; mixin opAssign!(m_far) far; } void main() { Camera cam = new Camera(); cam.fov = 1.0; stdin.readln; }
Dec 30 2014
Thanks Steven and Daniel for your explanations.
mixin template opAssign(alias Field) {
void opAssign(Tin)(auto ref Tin param) property pure
safe
{
Field = param;
m_matrixCalculated = false;
}
}
mixin opAssign!(m_pos) pos;
I tested both the "string mixin" and "opAssign" implementations,
and they work like a charm.
I would have never thought of using both property and
"opAssign", but it looks like a secure way of doing it for the
compilation fails nicely if I type a wrong field in.
src/camera.d(58): Error: undefined identifier m_os, did you mean
variable m_pos?
Dec 30 2014
On 12/30/2014 05:17 AM, Claude wrote:use templates to define several methods (property setters) within a class to avoid some code duplication.I just saw this post, which is essentially the same question as Basile Burg's. I hope that a college (in France?) is teaching D and that this is a homework assignment. Cool stuff! :) Ali
Dec 30 2014
I just saw this post, which is essentially the same question as Basile Burg's. I hope that a college (in France?) is teaching D and that this is a homework assignment. Cool stuff! :)Maybe using templates to create properties is a bit overkill in this example. But I could not solve what I thought would be a very simple and straightforward "template use-case" (initially I'm an embedded RT system C/asm developer). I'm doing this for a personal project of a 3D engine. As I know little about C++/Java or other OO language, I thought I would do it directly in D, which seems very promising to me (but unfortunately not taught in France as far as I know).
Jan 08 2015









Steven Schveighoffer <schveiguy yahoo.com> 