digitalmars.D.learn - std.path.buildPath() and string enumeration
- nrgyzer (19/19) May 30 2012 Hi,
- bearophile (19/21) May 30 2012 The signature of buildPath is:
- bearophile (15/15) May 30 2012 A better solution is to use:
- nrgyzer (7/28) May 30 2012 Alright, thanks... but I want to do the following:
- Artur Skawina (17/47) May 30 2012 A bug, as an enum member is supposed to implicitly convert to its base t...
Hi, I've the following enumeration: enum path : string { log1 = "/var/log1", log2 = "/var/log2" } Now... when I try to do the following: string subDirectory = "example"; string newPath = buildPath(path.log1, subDirectory); I get the following errors: Error: template std.path.buildPath does not match any function template declaration Error: template std.path.buildPath(C) if (isSomeChar!(C)) cannot deduce template function from argument types !()(path,string) Error: template std.path.buildPath does not match any function template declaration Error: template std.path.buildPath(C) if (isSomeChar!(C)) cannot deduce template function from argument types !()(path,string) Is this a bug in std.path.buildPath() or is there anything I'm doing wrong?
May 30 2012
nrgyzer:Is this a bug in std.path.buildPath() or is there anything I'm doing wrong?The signature of buildPath is: immutable(C)[] buildPath(C)(const(C[])[] paths...); But your inputs aren't of the same type. Named enum create their own type. You give buildPath a type string and a type path, that is not a string. There are various solutions, this compiles, but it's not very safe: buildPath(cast(string)path.log1, subDirectory); Another solution is to not use a named enum: enum : string { path_log1 = "/var/log1", path_log2 = "/var/log2" } buildPath(path_log1, subDirectory) In bugzilla I have asked for an enum property that returns the raw value&type of an enum. Bye, bearophile
May 30 2012
A better solution is to use: struct Path { enum : string { log1 = "/var/log1", log2 = "/var/log2" } } Or even just: struct Path { enum string log1 = "/var/log1", log2 = "/var/log2"; } (In D structs, classes and enums start with an upper case). Bye, bearophile
May 30 2012
== Auszug aus bearophile (bearophileHUGS lycos.com)'s Artikelnrgyzer:Alright, thanks... but I want to do the following: foreach(c; __traits(allMembers, path)) if (!exists(mixin("path." ~ c))) mkdirRecurse(mixin("path." ~ c)); When I use a named enum, I can't use the source above... so I've to cast in the buildPath()-method to my path enumeration or is there any other chance to realize the foreach-loop?Is this a bug in std.path.buildPath() or is there anything I'm doing wrong?The signature of buildPath is: immutable(C)[] buildPath(C)(const(C[])[] paths...); But your inputs aren't of the same type. Named enum create their own type. You give buildPath a type string and a type path, that is not a string. There are various solutions, this compiles, but it's not very safe: buildPath(cast(string)path.log1, subDirectory); Another solution is to not use a named enum: enum : string { path_log1 = "/var/log1", path_log2 = "/var/log2" } buildPath(path_log1, subDirectory) In bugzilla I have asked for an enum property that returns the raw value&type of an enum. Bye, bearophile
May 30 2012
On 05/30/12 20:34, nrgyzer wrote:Hi, I've the following enumeration: enum path : string { log1 = "/var/log1", log2 = "/var/log2" } Now... when I try to do the following: string subDirectory = "example"; string newPath = buildPath(path.log1, subDirectory); I get the following errors: Error: template std.path.buildPath does not match any function template declaration Error: template std.path.buildPath(C) if (isSomeChar!(C)) cannot deduce template function from argument types !()(path,string) Error: template std.path.buildPath does not match any function template declaration Error: template std.path.buildPath(C) if (isSomeChar!(C)) cannot deduce template function from argument types !()(path,string) Is this a bug in std.path.buildPath() or is there anything I'm doing wrong?A bug, as an enum member is supposed to implicitly convert to its base type. [1] You might be able to work-around it like this template _path() { enum : string { log1 = "/var/log1", log2 = "/var/log2" } } alias _path!() path; artur [1] Actually, D's "typesafe variadic functions" don't play well with certain other features too, eg void f(A...)(A a) {} void f()(string[] a...) {} f("a", "b"); // expecting the second overload to be called is reasonable, // but this isn't what's going to happen.
May 30 2012