Function return different type according to the parameters.

Chris Nicholson-Sauls ibisbasenji at gmail.com
Sun Sep 24 07:10:15 PDT 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



More information about the Digitalmars-d-learn mailing list