• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 293
  • 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
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

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