Define methods using templates
Daniel Kozák via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Dec 30 06:08:34 PST 2014
V Tue, 30 Dec 2014 13:17:08 +0000
Claude via Digitalmars-d-learn <digitalmars-d-learn at 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?
>
> Thanks
class 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;
}
More information about the Digitalmars-d-learn
mailing list