On Wednesday, 15 July 2015 at 21:57:50 UTC, badlink wrote:
Hello, I can't figure how to write a template function that
accept either strings or array of strings.
This is my current code:
bool hasItemParent(T)(const(char)[] itemId, const(T)[] parentId)
if (is(typeof(T) == char) || (isArray!T && is(typeof(T[]) ==
char)))
{...}
I used const(T)[] because I'd like to accept immutable and
mutable strings.
But calling it with an immutable string generate this error:
Error: template cache.MetadataCache.hasItemParent cannot deduce
function from argument types !()(string, string), candidates
are:
cache.MetadataCache.hasItemParent(T)(const(char)[] itemId,
const(T)[] parentId) if (is(typeof(T) == char))
Any suggestions ?
Something like this:
import std.stdio;
import std.traits;
import std.range;
bool hasItemParent(A, B)(A itemId, B parentId)
if (isSomeString!(A) && (isSomeString!(B) || isArray!(B) &&
isSomeString!(ElementType!(B))))
{
writefln("%s", typeof(parentId).stringof);
return true;
}
void main(string[] args)
{
string one = "foo";
char[] two = "foo".dup;
const(char)[] three = "foo";
immutable(char)[] four = "foo";
string[] five = ["foo", "bar"];
char[][] six = ["foo".dup, "bar".dup];
const(char)[][] seven = ["foo", "bar"];
immutable(char)[][] eight = ["foo", "bar"];
hasItemParent(one, one);
hasItemParent(two, two);
hasItemParent(three, three);
hasItemParent(four, four);
hasItemParent(one, five);
hasItemParent(two, six);
hasItemParent(three, seven);
hasItemParent(four, eight);
}