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