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

Reply via email to