1) Is there a way to force a function to be always executed at
compile time (when it's possible to do so) no matter what
context it's called in?
No, but you could wrap it in a template to force it to always
execute at compile time. Of course it could then only be called
at compile time.
2) Is it possible to specialize a function based on whether or
not the parameter that was passed in is a compile time constant?
No.
3) Does any D compiler currently optimize out a conditional
branch which _can_ be evaluated at compile time (but which
isn't forced into CTFE)? Like:
int getValue(bool b)
{
return b ? 123 : 456;
}
//...
auto value = getValue(true);
DMD, LDC and GDC all do this when compiling with optimizations
turned on. They all compile these functions to exactly the
same code:
auto foo()
{
return getValue(true);
}
auto bar()
{
return 123;
}