On Sat, 10 Dec 2011 02:42:30 -0500, Andrew Wiley <wiley.andre...@gmail.com> wrote:

On Sat, Dec 10, 2011 at 1:23 AM, Andrew Wiley <wiley.andre...@gmail.com> wrote:
Is there a syntax that allows me to specify arguments to a templated
constructor for a struct? The intuitive way looks like this, but it
doesn't work.

---
struct Test {
this(T, bool b)(T info) if((b && something ) || (!b && somethingElse)) {

       }
}

void main() {
       Test test = Test!(int, true)(5); // Error: template instance
Test!(int,true) Test is not a template declaration, it is a struct
}
---

Looks like I can work around it by doing this:
---
template makeTest(T, bool b) {
    static if((b && something) || (!b && somethingElse)) {
        alias Test makeTest;
    }
    else static assert(0, "some error message");
}
struct Test {
    private:
    this(T)(T info) {
    }
}
void main() {
    Test test = Test!(int, true)(5); // Error: template instance
    Test!(int,true) Test is not a template declaration, it is a struct
}
---

But this solution isn't very satisfying because Test is no longer
directly protected by the static checks I want.

A constructor is just a function.  Use an IFTI-able function instead:

Test makeTest(bool b, T)(T info) {...; return Test(realCtorArgsHere);}

As a bonus, you don't have to specify T because of IFTI (which is why I made it the second template parameter).

C++ and D are full of little trinkets like this. The earliest example I can remember is std::make_pair from C++.

-Steve

Reply via email to