digitalmars.D.learn - Function return different type according to the parameters.
- nojoking <kuangdong gmail.com> Sep 24 2006
- Chris Nicholson-Sauls <ibisbasenji gmail.com> Sep 24 2006
How to return different types?For Example:
test.d
/++/
import std.stdio;
void main()
{
Test test;
test["a"]="A string. ";
test["b"]=1234;
test["c"]=true;
writefln(test["a"],test["b"],test["c"]);
}
struct Test
{
char[][char[]] strarr;
int[char[]] intarr;
bool[char[]] bolarr;
void opIndexAssign(int value,char[] key)
{
intarr[key]=value;
}
void opIndexAssign(char[] value,char[] key)
{
strarr[key]=value;
}
void opIndexAssign(bool value,char[] key)
{
bolarr[key]=value;
}
/+???????????????????
opIndex(char[] key)
{
}
???????????????????+/
}
Sep 24 2006
nojoking wrote:How to return different types?For Example: test.d /++/ import std.stdio; void main() { Test test; test["a"]="A string. "; test["b"]=1234; test["c"]=true; writefln(test["a"],test["b"],test["c"]); } struct Test { char[][char[]] strarr; int[char[]] intarr; bool[char[]] bolarr; void opIndexAssign(int value,char[] key) { intarr[key]=value; } void opIndexAssign(char[] value,char[] key) { strarr[key]=value; } void opIndexAssign(bool value,char[] key) { bolarr[key]=value; } /+??????????????????? opIndex(char[] key) { } ???????????????????+/ }
Strictly speaking, you can't. There is no overloading on return type. What you can do, however, is to return a Box (see: std.boxer) or write and return a Var struct, such as this: # struct Var { # static enum Type { Str, Int, Bool } # # Type type ; # union { # char[] s ; # int i ; # bool b ; # } # } In which case your opIndex could be something like: # Var opIndex (char[] key) { # Var result ; # # if (auto x = key in strarr) { # result.type = Type.Str ; # result.s = (*x).dup ; # } # else if (auto y = key in intarr) { # result.type = Type.Int ; # result.i = *y ; # } # else if (auto z = key in bolarr) { # result.type = Type.Bool ; # result.b = *z ; # } # else { # throw new Exception("key not found: '" ~ key ~ "'"); # } # } -- Chris Nicholson-Sauls
Sep 24 2006








Chris Nicholson-Sauls <ibisbasenji gmail.com>