| Thread overview | |||||
|---|---|---|---|---|---|
|
February 08, 2014 Strange behavior with opAssign and static if | ||||
|---|---|---|---|---|
| ||||
Hi,
I have a template structure Decimal which is used in a OrderDb structure. The opAssign method in Decimal leads to strange
behavior in the function execute();
The function execute stores the values of OrderDb in a variant
array. Decimals value should be stored as strings. There is
a static if for this condition.
There is a compilation error for the line
arr[i] = __traits(getMember, struc, member);
-> function.main.OrderDb.opAssign (OrderDb p) is not callable using argument types ()
This compilation error disappears if I remove the opAssign method
in Decimal.
How can the opAssign of Decimal influence the code path for a non
decimal field?
Kind regards
André
---code---
import std.traits: isInstanceOf;
import std.variant;
struct Decimal(int precision, int scale){
void opAssign(T)(T d)
if (isInstanceOf!(Decimal, T)){}
string toString(){return "10.22";};
}
struct OrderDb{
string orderId;
Decimal!(10,2) amount;
}
void main(){
execute(OrderDb());
}
void execute(T)(T struc){
Variant[] arr = new Variant[](2);
foreach (i, member;__traits(allMembers, T)){
static if (isInstanceOf!(Decimal, typeof(__traits(getMember, struc, member)))){
// Store decimals as string
arr[i] = (__traits(getMember, struc, member)).toString();
} else {
// Store other values with their types
arr[i] = __traits(getMember, struc, member);
}
}
}
| ||||
February 08, 2014 Re: Strange behavior with opAssign and static if | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Andre | __traits(allMembers) gives you *all* members, including methods (even implicit).
As soon as you define opAssign for your Decimal, it gets defined for OrderDb too, and then you try to assign to it :)
What you need is something like this:
void execute(T)(T struc){
Variant[] arr = new Variant[](2);
foreach(i, member; struc.tupleof) {
static if (isInstanceOf!(Decimal, typeof(member))){
// Store decimals as string
arr[i] = member.toString();
} else {
// Store other values with their types
arr[i] = member;
}
}
}
| |||
February 08, 2014 Re: Strange behavior with opAssign and static if | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Stanislav Blinov | Thanks a lot!
This works great.
Am 08.02.2014 14:27, schrieb Stanislav Blinov:
> __traits(allMembers) gives you *all* members, including methods (even
> implicit).
> As soon as you define opAssign for your Decimal, it gets defined for
> OrderDb too, and then you try to assign to it :)
>
> What you need is something like this:
>
> void execute(T)(T struc){
> Variant[] arr = new Variant[](2);
>
> foreach(i, member; struc.tupleof) {
> static if (isInstanceOf!(Decimal, typeof(member))){
> // Store decimals as string
> arr[i] = member.toString();
> } else {
> // Store other values with their types
> arr[i] = member;
> }
> }
> }
>
>
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply