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);
}

Reply via email to