Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 291
  • Last Modified:

function template conditional execution of code

Hi,

I want to do the following

------------------------------------------------------------------------------------
     template <class T> void PutToSA(SAFEARRAY* &insa,long ElemNo,T& InVal)
     {
          VARIANT MyVar;
          VariantInit(&MyVar);
#if typeof(T) is CString
          MyVar.vt=VT_BSTR;
          MyVar.bstrVal=InVal.AllocSysString();
#else
          MyVar.vt=VT_I2;
          MyVar.intVal=InVal;
#end if
          SafeArrayPutElement(insa,&ElemNo,&MyVar);
     };

------------------------------------------------------------------------------------

However, I just made up the "#if typeof" statement

Is there another way of doing this ???

I know I can create another template just for the CString class, but this seems to defeat the purpose of templates...
0
smegghead
Asked:
smegghead
1 Solution
 
CriusCommented:
Eee, well, bad to use precompiled directives like this in code. Probably wouldn't work well anyway.

Try using COleVariant. It has a constructor that takes in all sorts of different variable types.

    template <class T> void PutToSA(SAFEARRAY* &insa,long ElemNo,T& InVal)
    {
         COleVariant MyVar(T);

         SafeArrayPutElement(insa,&ElemNo,&MyVar);
    };

It also allocates and deallocates memory (And calls the VariantInit) functions automatically. If you allocate a BSTR, it must be deallocated somewhere afterall. :)
0
 
CriusCommented:
Oops, sorry,

COleVariant MyVar(InVal);

Don't use the type of the variable, just the value. Hehe.
0
 
AxterCommented:
Here's one method to test for CString.

 template <class T>
bool IsCString(T)
 {
      return false;
 }

bool IsCString(CString)
 {
      return true;
 }

 template <class T>
void FuncXyz(T Src)
{
      if (IsCString(Src))
      {
           AfxMessageBox("Is CString");
      }
      else
      {
           AfxMessageBox("Not CString");
      }
}
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
ct.smithCommented:
Seems to me like this is a good case for template specialisation:

template <class T> void PutToSA(SAFEARRAY* &insa,long ElemNo,T& InVal)
    {
         VARIANT MyVar;
         VariantInit(&MyVar);
         MyVar.vt=VT_I2;
         MyVar.intVal=InVal;
         SafeArrayPutElement(insa,&ElemNo,&MyVar);
    };

template <CString> void PutToSA(SAFEARRAY* &insa,long ElemNo,CString& InVal)
    {
         VARIANT MyVar;
         VariantInit(&MyVar);
         MyVar.vt=VT_BSTR;
         MyVar.bstrVal=InVal.AllocSysString();
         SafeArrayPutElement(insa,&ElemNo,&MyVar);
    };

Small catch, I don't have VC6 handy to double check my example code, but the spirit of the solution is fairly straightforward.
0
 
andymurdCommented:
ct.smith is correct, but I think an overload rather than template specialzation is more appropriate.

So you would have:

void PutToSA(SAFEARRAY* &insa,long ElemNo,CString& InVal)
   {
        VARIANT MyVar;
        VariantInit(&MyVar);
        MyVar.vt=VT_BSTR;
        MyVar.bstrVal=InVal.AllocSysString();
        SafeArrayPutElement(insa,&ElemNo,&MyVar);
   };

template <class T> void PutToSA(SAFEARRAY* &insa,long ElemNo,T& InVal)
   {
        VARIANT MyVar;
        VariantInit(&MyVar);
        MyVar.vt=VT_I2;
        MyVar.intVal=InVal;
        SafeArrayPutElement(insa,&ElemNo,&MyVar);
   };

NOTE: The CString version comes BEFORE the template so the compiler will pick that one first if appropriate.
0
 
smeggheadAuthor Commented:
Hi,

Thanks for your advice everyone, I have, in the interim, gone for the function overload solution, as this works fine.

However, I really wanted a way of branching code depending on the type/class passed in... it seems strange that the compiler doesn't have some way of doing this. It would make code a lot simpler and avoid a lot of duplicate code.

crius... I wasn't suggesting using pre-processor directives, this was just an example of the sort of thing I wanted to do.

I'm inclined to give the points to axter, as he/she came up with a solution I'd not thought of/tried.

So I'm gonna pass the points on to axter...

Sorry everyone else... I do appreciate your suggestions...

Regards

Smg.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now