On 02/18/2014 03:43 PM, Arjan wrote:
When a user defined type is used as an attribute like this:
// the attribute
struct MyAttrib
{
immutable string name;
imuttable int sz;
immutable string defaultvalue;
}
// using the attribute
class Data
{
// field 'id' has attribute MyAttrib with name and sz set to 'fancy
name'
// and 10 resp.
@MyAttrib( "fancy name", 10 )
long id;
...
}
But how do I only set the MyAttrib.defaultvalue?
class OtherData
{
//@MyAttrib( ??defaultvalue = "null" ?? )
//@MyAttrib( string.init, int.init, "null" ) //seems to work?
long id;
...
}
MyAttrib instances may be initialized like this:
auto myattrib = { defaultvalue:"null" };
But this seems not possible when using MyAttrib as attribute.
This problem has nothing to do with UDAs and can be solved similar to
regular cases, e.g. by using a factory function:
// the attribute
struct MyAttrib
{
immutable string name;
immutable int sz;
immutable string defaultvalue;
}
MyAttrib makeMyAttribWithDefaultValue(string defaultValue)
{
return MyAttrib(MyAttrib.name.init, MyAttrib.sz.init, defaultValue);
}
// using the attribute
class Data
{
// field 'id' has attribute MyAttrib with name and sz set to 'fancy
name'
// and 10 resp.
@MyAttrib( "fancy name", 10 )
long id;
@makeMyAttribWithDefaultValue("hello")
int i;
}
void main()
{
pragma(msg, __traits(getAttributes, Data.id));
pragma(msg, __traits(getAttributes, Data.i));
}
Ali