Jon Stewart on 18 Jul 2003 19:14:01 -0000


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [ALACPP] oh, the tragedy


> Jon, Jon, Jon.
> 
> You do know, of course, just how evil you're being?


Being evil is a requirement for working with COM. So, yes.


> Jeez!
> 
> Why not a nice, simple assign, then the condition? Twice the line count,
> thrice as easy to read.
> 
> const bool* val = VarWrapperClass(somePtr->Array[0]);
> if(somePtr && 1 == somePtr->Count && val) ...


Because that's incorrect. The order of the two lines needs to be reversed, 
otherwise there's no point in testing somePtr and somePtr->Count -- I need 
to know that somePtr->Array[0] is valid first.

AND because I only want to do something if the conversion succeeds, i.e. 
val is not null.

Semantically, the if-statement is guarding against the user (the COM 
client) calling this method incorrectly via the IDispatch interface, so if 
they screwed up the arguments, fail the if.

I could write:

if(somePtr && 1 == somePtr->Count) {
  const bool* val = VarWrapperClass(somePtr->Array[0]);
  if(val) {
    ... do stuff with *val ...
    return S_OK;
  }
}
return DISP_E_TYPEMISMATCH;

but that just sucks.

Instead, I defined this function:

template<class T>
T ToType(DISPPARAMS *args, uint index) {
  if (args && index < args->cArgs) {
    return T(VarWrapperClass(args->rgvarg[index]));
  return 0;
}

and then write my conditionals as such:

if(const bool* val = ToType<const bool*>(args, 0)) {
  ... do stuff with *val ...
  return S_OK;
}

>From here I can write:

const bool* val = ToType<const bool*>(args, 0);
if (val) {

}

Happy? :-)


> I really, really hate it when people use the side effect of assignment (ie,
> the return value). It just adds obfuscation. I wish they'd defined the
> language so that assign didn't have a return value, by the rule that each
> function should either have a return value or a side effect. OK, so I don't
> always believe in the rule, but still.
> 
> And from such a big Functional Programming person. And our const-nazi! Oh, fo
> r
> shame. For shame.


Hey! What's not const-correct about this? ;-) Notice I only allow implicit 
conversion of pointers to const objects, to ensure r-value usage only.



Jon
-- 
Jon Stewart
stew1@xxxxxxxxxxx
_______________________________________________
alacpp mailing list
alacpp@xxxxxxxxxxx
http://lists.ellipsis.cx/mailman/listinfo/alacpp