By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,421 Members | 1,127 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,421 IT Pros & Developers. It's quick & easy.

How do you know datatype when using Templates?

P: n/a
Hi folks,

I've got a program which has a function which uses templates to accept
parameters of any type.

Works well, but there's one certain datatype which I want to special case
and do an extra thing to. The datatype is a class I made.

Is there anyway for me to test a parameters datatype in a template using
function?

Thanks a lot!!!
Jul 22 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a
"Eternally" <m@r.com> wrote...
I've got a program which has a function which uses templates to accept
parameters of any type.

Works well, but there's one certain datatype which I want to special case
and do an extra thing to. The datatype is a class I made.

Is there anyway for me to test a parameters datatype in a template using
function?


No. Well, there may be, but you better forget about it. That
is not the C++ way. The C++ way would be to either specialise
your template based on your new type or to overload the function
based on your type.

So, given

template<class T> void genericFun(T& t)
{
// does something to 't'
}

class myPreciousNewType {};

you want to add something to 'genericFun' to only do it to
an object of 'myPreciousNewType'. Here is how you do it:

// specialised:
template<> void genericFun<myPreciousNewType>(
myPreciousNewType& mpnt)
{
// basically copy all of it, then add some extra
}

or (better)

// overloaded:
void genericFun(myPreciousNewType& t)
{
// extra functionality
genericFun<myPreciousNewType>(t);
// extra functionality
}

YMMV, and variations of this are easily derived.

Victor
Jul 22 '05 #2

P: n/a

"Victor Bazarov" <v.********@comAcast.net> wrote in message
news:9jyzb.216281$Dw6.790779@attbi_s02...
"Eternally" <m@r.com> wrote...
I've got a program which has a function which uses templates to accept
parameters of any type.

Works well, but there's one certain datatype which I want to special case and do an extra thing to. The datatype is a class I made.

Is there anyway for me to test a parameters datatype in a template using
function?


No. Well, there may be, but you better forget about it. That
is not the C++ way. The C++ way would be to either specialise
your template based on your new type or to overload the function
based on your type.

So, given

template<class T> void genericFun(T& t)
{
// does something to 't'
}

class myPreciousNewType {};

you want to add something to 'genericFun' to only do it to
an object of 'myPreciousNewType'. Here is how you do it:

// specialised:
template<> void genericFun<myPreciousNewType>(
myPreciousNewType& mpnt)
{
// basically copy all of it, then add some extra
}

or (better)

// overloaded:
void genericFun(myPreciousNewType& t)
{
// extra functionality
genericFun<myPreciousNewType>(t);
// extra functionality
}

YMMV, and variations of this are easily derived.

Victor


Ohhhhh....Rats! :)

Thanks for the help. I was trying to avoid that, but I guess that's the way
to go.

I say "Rats!" because I kind of accidentally fibbed. Right now I only need
to special case one datatype, but soon it'll be like 5. They'll all be
special cased in the same exact manner though, so the psuedocode could've
looked like:

if(datatype==type1 or datatype==type2 or datatype==type3 or.....){
do the special case
}

I would just create 2 seperate functions with different names, but the
function that we're talking about here is actually the constructor function
in a class that I have.

Thanks a lot for the help though. If you can think of anything else, please
respond, but otherwise I'll just overload it X number of times.

Thanks again!
Jul 22 '05 #3

P: n/a

"Eternally" <m@r.com> wrote in message
news:j%********************@twister.nyroc.rr.com.. .
Hi folks,

I've got a program which has a function which uses templates to accept
parameters of any type.

Works well, but there's one certain datatype which I want to special case
and do an extra thing to. The datatype is a class I made.

Is there anyway for me to test a parameters datatype in a template using
function?

Yes I think I know what you mean , there is a STL <typeinfo>
It works something like this:

#include <iostream>
#include <typeinfo>

class UDT{};

template <typename T>
void foo(T arg){
std::cout << typeid(T).name() << '\n';
}

int main(){
int intX =0;
char chX =0;
UDT udtX;

foo(intX), foo(chX), foo(udtX);
return 0;
}

This will output the following:
int
char
class UDT
....

Look up your docs to get more info about it and you might need to set
compiler options to enable runtime type info .
HTH.
:o)
Jul 22 '05 #4

P: n/a

"Jumbo" <pc****************@uko2.co.uk> wrote in message
news:10***************@news.minx.net.uk...

"Eternally" <m@r.com> wrote in message
news:j%********************@twister.nyroc.rr.com.. .
Hi folks,

I've got a program which has a function which uses templates to accept
parameters of any type.

Works well, but there's one certain datatype which I want to special case and do an extra thing to. The datatype is a class I made.

Is there anyway for me to test a parameters datatype in a template using
function?

Yes I think I know what you mean , there is a STL <typeinfo>
It works something like this:

#include <iostream>
#include <typeinfo>

class UDT{};

template <typename T>
void foo(T arg){
std::cout << typeid(T).name() << '\n';
}

int main(){
int intX =0;
char chX =0;
UDT udtX;

foo(intX), foo(chX), foo(udtX);
return 0;
}

This will output the following:
int
char
class UDT
...

Ahhh.....That's perfect. Exactly what I need. Just tested it and it works
great.

Thanks!
Jul 22 '05 #5

P: n/a
On Thu, 04 Dec 2003 06:40:29 GMT, "Eternally" <m@r.com> wrote:
Yes I think I know what you mean , there is a STL <typeinfo>
It works something like this:

#include <iostream>
#include <typeinfo>

class UDT{};

template <typename T>
void foo(T arg){
std::cout << typeid(T).name() << '\n';
}

int main(){
int intX =0;
char chX =0;
UDT udtX;

foo(intX), foo(chX), foo(udtX);
return 0;
}

This will output the following:
int
char
class UDT
...

Ahhh.....That's perfect. Exactly what I need. Just tested it and it works
great.


Note that typeid(T) is a relatively slow operator, whereas template
specialization is compile time and therefore has zero time overhead.

Tom

C++ FAQ: http://www.parashift.com/c++-faq-lite/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Jul 22 '05 #6

P: n/a

Ahhh.....That's perfect. Exactly what I need. Just tested it and it works
great.

Thanks!


It may work, but it slows down your application.

What's wrong with template specialization/overload as Victor
suggested, anyways? Instead of checking type ID and doing a manual
switch to select a function, you let the compiler generate that code
for you. MUCH simpler! And faster. And cleaner.
Jul 22 '05 #7

P: n/a

"Eternally" <m@r.com> wrote in message
news:gX*********************@twister.nyroc.rr.com. ..

"Victor Bazarov" <v.********@comAcast.net> wrote in message
news:9jyzb.216281$Dw6.790779@attbi_s02...
"Eternally" <m@r.com> wrote...
I've got a program which has a function which uses templates to accept
parameters of any type.

Works well, but there's one certain datatype which I want to special case and do an extra thing to. The datatype is a class I made.

Is there anyway for me to test a parameters datatype in a template using function?
No. Well, there may be, but you better forget about it. That
is not the C++ way. The C++ way would be to either specialise
your template based on your new type or to overload the function
based on your type.

So, given

template<class T> void genericFun(T& t)
{
// does something to 't'
}

class myPreciousNewType {};

you want to add something to 'genericFun' to only do it to
an object of 'myPreciousNewType'. Here is how you do it:

// specialised:
template<> void genericFun<myPreciousNewType>(
myPreciousNewType& mpnt)
{
// basically copy all of it, then add some extra
}

or (better)

// overloaded:
void genericFun(myPreciousNewType& t)
{
// extra functionality
genericFun<myPreciousNewType>(t);
// extra functionality
}

YMMV, and variations of this are easily derived.

Victor


Ohhhhh....Rats! :)

Thanks for the help. I was trying to avoid that, but I guess that's the

way to go.

I say "Rats!" because I kind of accidentally fibbed. Right now I only need to special case one datatype, but soon it'll be like 5. They'll all be
special cased in the same exact manner though, so the psuedocode could've
looked like:

if(datatype==type1 or datatype==type2 or datatype==type3 or.....){
do the special case
}

I would just create 2 seperate functions with different names, but the
function that we're talking about here is actually the constructor function in a class that I have.

Thanks a lot for the help though. If you can think of anything else, please respond, but otherwise I'll just overload it X number of times.


You can specialize constructors just incase you don't realise this.
So you have a different constructor for each specialized type.

This is probably the more efficient way but you'll know best exactly what
your trying do.

HTH.
Jul 22 '05 #8

P: n/a
Hi,

You can use type_info class to get the type information inside a template
method.

One more way is CRuntimeClass if you are using MFC. But is it good to use
specific type stuff inside a template method ?

Bye
Chandra

Eternally wrote:
Hi folks,

I've got a program which has a function which uses templates to accept
parameters of any type.

Works well, but there's one certain datatype which I want to special case
and do an extra thing to. The datatype is a class I made.

Is there anyway for me to test a parameters datatype in a template using
function?

Thanks a lot!!!


Jul 22 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.