On Mon, Nov 03, 2014 at 11:43:42PM +0000, Domingo via Digitalmars-d-learn wrote:
> Hello !
> 
> I could not find a clear way that show how to use template types as
> parameter to functions:
> 
> There is a general rule to do it ? On several examples when the return type
> comes from a template I saw the usage of "auto" where the compiler will
> deduce the correct type but when we need to pass that value as a parameter
> to a function how we declare then as parameter ?
> 
> 
> //void dummFunction(type<Bson,Bson,Bson> "appender", type<forFromAuto>
> "another templated type")
> 
> void dummFunction(typeforFromAuto "appender", typeforFromAuto "another
> templated type")
> {
> }

Use the typeof operator, for example:

        auto myfunc(...) {
                struct InternalType { ... }
                ...
                return InternalType(...);
        }

        void anotherFunc(typeof(myfunc(...)) x) { ... }

        void main() {
                auto x = myfunc(...);
                anotherFunc(x);
        }

Using typeof() everywhere is ugly, though, so you could abstract it away
with an alias:

        auto myfunc(...) { ... }

        alias MyType = typeof(myfunc(...));

        void anotherFunc(MyType x) { ... }

        ...

On the other hand, if anotherFunc() doesn't really need to know what
exact type is passed, you could turn it into a template function:

        auto myfunc(...) { ... }

        // Now you can pass anything to anotherFunc:
        void anotherFunc(T)(T x) { ... }

But passing "anything" may cause problems, if anotherFunc expects x to
have certain methods, but it's not guaranteed to have them:

        void anotherFunc(T)(T x) {
                ...
                x.method(); // will fail if T is int, for example
                ...
        }

In this case you can use a signature constraint to limit the scope of
what anotherFunc will accept:

        auto myfunc(...) { ... }

        void anotherFunc(T)(T x)
                if (is(T.init.method())) // test that T has a method called 
"method"
        {
                ...
                x.method();
                ...
        }


T

-- 
Being able to learn is a great learning; being able to unlearn is a greater 
learning.

Reply via email to