Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Follow-up: Finding template parameter types

Posted on 2009-07-12
11
240 Views
Last Modified: 2012-05-07
Hi,

This is a follow up from:
http://www.experts-exchange.com/Q_24563512.html

Evilrix posted a solution which gets resolved at compile time, although the if statements appear within the function foo(), how can different function defenitions be created at compile-time based on the parameters put into the template - or perhaps a better question, how does the Boost signals library manage to achieve creating different function defintions for the callbacks?

Thanks,
Uni
0
Comment
Question by:Unimatrix_001
  • 6
  • 5
11 Comments
 
LVL 40

Expert Comment

by:evilrix
ID: 24834854
hi Uri. Out having food right now. I'll get back to you when I return :)
0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 24834861
No probs - enjoy yourself. :)
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24835546
Ok, see what you make of the code below...
#include <iostream>
 
struct NoArg {};
 
template<typename A, typename B = NoArg, typename C = NoArg>
class CMyClass
{
public:
	void foo(A, B, C)
	{
		std::cout << "void foo(A, B, C)" << std::endl;
	}
};
 
template<typename A, typename B >
class CMyClass<A, B, NoArg>
{
public:
	void foo(A, B)
	{
		std::cout << "void foo(A, B)" << std::endl;
	}
};
 
template<typename A>
class CMyClass<A, NoArg, NoArg>
{
public:
	void foo(A)
	{
		std::cout << "void foo(A)" << std::endl;
	}
};
 
 
int main()
{
        CMyClass<int, char, float> c1;
        c1.foo(1, 'c', 2.34);
        
        CMyClass<int, char> c2;
        c2.foo(1, 'c');
 
        CMyClass<int> c3;
        c3.foo(1);
}

Open in new window

0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
LVL 3

Author Comment

by:Unimatrix_001
ID: 24835567
Ah okay - I see... How would things fare if we had something like this for example:
template<typename A, typename B = NoArg, typename C = NoArg, typename D = std::allocator<A> >
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24835635
>> How would things fare if we had something like this for example:
Arrr... brain hurts..... arrrg! :)



#include <iostream>
 
struct NoArg {};
 
template<typename A, typename B = NoArg, typename C = NoArg, typename D = std::allocator<A> >
class CMyClass
{
public:
	void foo(A, B, C)
	{
		std::cout << "void foo(A, B, C)" << std::endl;
	}
};
 
template<typename A, typename B >
class CMyClass<A, B, NoArg>
{
public:
	void foo(A, B)
	{
		std::cout << "void foo(A, B)" << std::endl;
	}
};
 
template<typename A>
class CMyClass<A, NoArg, NoArg>
{
public:
	void foo(A)
	{
		std::cout << "void foo(A)" << std::endl;
	}
};
 
 
int main()
{
        CMyClass<int, char, float, std::allocator<double> > c0;
	
        CMyClass<int, char, float> c1;
        c1.foo(1, 'c', 2.34);
        
        CMyClass<int, char> c2;
        c2.foo(1, 'c');
 
        CMyClass<int> c3;
        c3.foo(1);
}

Open in new window

0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 24835643
>>Arrr... brain hurts..... arrrg! :)
Hehe, I'm nearly done. ;)

The thing with that is the last CMyClass:

--------------------------------------------------------------------------------------------------------
template<typename A>
class CMyClass<A, NoArg, NoArg>
{
public:
        void foo(A)
        {
                std::cout << "void foo(A)" << std::endl;
        }
};
--------------------------------------------------------------------------------------------------------

doesn't actually know anything about the D typename, so could never use this - correct?
0
 
LVL 40

Accepted Solution

by:
evilrix earned 500 total points
ID: 24835650
>> correct?
Yes. Each class is, in effect, a unique object that knows nothing about the others. Specializing or partial specializing a class is really just defining new types of a class. Without knowing the specific requirements you have all I can do is try and provide you examples that I think may aid your understanding but that are not necessarily the best solutions to specific problems (does that make sense?).
0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 24835656
Yes, that's perfect! :) No specific requirements just remaining questions on templates. ;) Cheers for the help, hope you enjoyed your evening! :)

Uni.
0
 
LVL 3

Author Closing Comment

by:Unimatrix_001
ID: 31602584
Excellent.
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24835657
>> Cheers for the help, hope you enjoyed your evening! :)
Muahahahaha.... I've just drunk lots of beer, not sure I should even be attempting template questions!

In fact, I am off to bed to sleep myself into a hangover ;)
0
 
LVL 3

Author Comment

by:Unimatrix_001
ID: 24835662
Hahahaha! Enjoy your headache-to-come... ;)
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question