Define methods using templates

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Dec 30 05:48:13 PST 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


More information about the Digitalmars-d-learn mailing list