473,225 Members | 1,264 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,225 software developers and data experts.

Partial Implementation of templates

Hi,

I would like to specify behavior of a class member relatively to
template implemetation. It works in usual cases but it seems to fail
with to templates when one of the two is specified...

Exemple:

template <class T, int Num>
class A
{
void foo ();
}

// The generic implementation is:
template <class T, int Num>
void
A<T,Num>
::foo ()
{
// generic code
}

// I would like to add a specific code when Num equals 2 fior
instance:
template <class T>
void
A<T,2>
::foo()
{
// an other code...
}

// But g++ 3.2.3 (on Redhat Fedora 5) does not like it
Is there any solution, knowing that a complete non-genric code is
possible (i.e. defined a void A<int,2>::foo() directly)?

Any help is appreciated.
Greg

Aug 16 '07 #1
9 1909
On 16 Srp, 11:53, Greg <Gregoire.M.Merc...@gmail.comwrote:
Hi,

I would like to specify behavior of a class member relatively to
template implemetation. It works in usual cases but it seems to fail
with to templates when one of the two is specified...

Exemple:

template <class T, int Num>
class A
{
void foo ();

}

// The generic implementation is:
template <class T, int Num>
void
A<T,Num>
::foo ()
{
// generic code

}

// I would like to add a specific code when Num equals 2 fior
instance:
template <class T>
void
A<T,2>
::foo()
{
// an other code...

}

// But g++ 3.2.3 (on Redhat Fedora 5) does not like it
Is there any solution, knowing that a complete non-genric code is
possible (i.e. defined a void A<int,2>::foo() directly)?

Any help is appreciated.
Greg
Partial specialization works only for classes/structs:

template <class T, int Num>
class A
{
void foo ()
{
// generic code

}

}

template <class T>
class A<T, 2>
{
void foo ()
{
// specialized code

}

}

Aug 16 '07 #2
Hi!

Ondra Holub schrieb:
Partial specialization works only for classes/structs:
And for non-member functions and template functions of non-template
classes. Right?

They just don't work for partially specializing a templated member
function of a class template. Right?

Is there a link to read up on this issue?

Frank
Aug 16 '07 #3
On 16 Srp, 14:00, Frank Birbacher <bloodymir.c...@gmx.netwrote:
Hi!

Ondra Holub schrieb:
Partial specialization works only for classes/structs:

And for non-member functions and template functions of non-template
classes. Right?
I think it works only for classes (and structs, what is the same with
different default access type). You can as workaround create class
with static method and use partial specialization of this class.

AFAIK partial specialization of functions is considered in prepared
standard, but I am not sure.

Aug 16 '07 #4
Hi!

Ondra Holub schrieb:
AFAIK partial specialization of functions is considered in prepared
standard, but I am not sure.
No. The following already works (not with MSVC prior to 7.1, though):

//generic
template<typename T>
void process(T t) {}

//partial specialization
template<typename T>
void process(T* const t) {}

//full specialization
template<>
void process(void* const t) { throw "what is it?"; }

int main()
{
int i = 8;
process(i);
process(&i);
process( static_cast<void*>(&i) );
}

Frank
Aug 16 '07 #5
joe
This also seems to work in VC8 anyway and has the advantage of not
having to reimplement the whole of class A:

#include <iostream>

template <class T, int Num>
class A
{
public:
void foo()
{
foo_impl<Num>();
}

private:

template <int N>
void foo_impl()
{
std::cout << "Default Foo" << std::endl;
}
template <>
void foo_impl<2>()
{
std::cout << "Special Foo" << std::endl;
}
};
int main()
{
A<int, 0a0;
A<int, 2a2;

a0.foo();
a2.foo();
}

Hope that helps in some way.

joe

Aug 16 '07 #6
On 16 Srp, 14:48, Frank Birbacher <bloodymir.c...@gmx.netwrote:
Hi!

Ondra Holub schrieb:
AFAIK partial specialization of functions is considered in prepared
standard, but I am not sure.

No. The following already works (not with MSVC prior to 7.1, though):

//generic
template<typename T>
void process(T t) {}

//partial specialization
template<typename T>
void process(T* const t) {}

//full specialization
template<>
void process(void* const t) { throw "what is it?"; }

int main()
{
int i = 8;
process(i);
process(&i);
process( static_cast<void*>(&i) );

}

Frank
Yes. it works. But it is full specialization, not partial
specialization. Try following:

template<typename T, int N>
void Func()
{
}

template<typename T>
void Func<T, 10>()
{
}

On gcc you'll get error: partial specialization `Func<T, 10>' of
function template, on Visual C++ .net 2003 you'll get error C2768:
'Func' : illegal use of explicit template arguments (the same on
Visual C++ 2005).

Aug 16 '07 #7
>
Hi!
Ondra Holub schrieb:
AFAIK partial specialization of functions is considered in prepared
standard, but I am not sure.
No. The following already works (not with MSVC prior to 7.1, though):
//generic
template<typename T>
void process(T t) {}
//partial specialization
template<typename T>
void process(T* const t) {}
//full specialization
template<>
void process(void* const t) { throw "what is it?"; }
int main()
{
int i = 8;
process(i);
process(&i);
process( static_cast<void*>(&i) );
}
Frank

Yes. it works. But it is full specialization, not partial
specialization. Try following:
No it's just a overloaded template function.the last one is a full
specialization though

Aug 16 '07 #8
Hi!

Ondra Holub schrieb:
On 16 Srp, 14:48, Frank Birbacher <bloodymir.c...@gmx.netwrote:
> //generic
template<typename T>
void process(T t) {}

//partial specialization
template<typename T>
void process(T* const t) {}
Is the above really a "full specialization"? o_O
Yes. it works. But it is full specialization, not partial
specialization. Try following:

template<typename T, int N>
void Func()
{
}

template<typename T>
void Func<T, 10>()
{
}
-.- ok, fails. But why? I don't understand this restriction, especially
because classes can be partially specialized.

Frank
Aug 16 '07 #9
On 16 Srp, 16:04, Frank Birbacher <bloodymir.c...@gmx.netwrote:
Hi!

Ondra Holub schrieb:
On 16 Srp, 14:48, Frank Birbacher <bloodymir.c...@gmx.netwrote:
//generic
template<typename T>
void process(T t) {}
//partial specialization
template<typename T>
void process(T* const t) {}

Is the above really a "full specialization"? o_O
Well, you're right, I missed this one in the middle :-)
>
Yes. it works. But it is full specialization, not partial
specialization. Try following:
template<typename T, int N>
void Func()
{
}
template<typename T>
void Func<T, 10>()
{
}

-.- ok, fails. But why? I don't understand this restriction, especially
because classes can be partially specialized.

Frank
I do not understand it too, but this is current situation :-( I
usually use workaround with static class member which works, although
it looks not as good as simple function:

template<typename T, int N>
class X
{
static void Func() { }
};

template<typename T>
class X<T, 10>
{
void Func<T, 10>() { }
};

Maybe we'll have to wait for a new standard... And then it will depend
on supplier of our compiler :-)

Aug 16 '07 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

17
by: Paul MG | last post by:
Hi Template partial specialization always seems like a fairly straightforward concept - until I try to do it :). I am trying to implement the input sequence type (from Stroustrup section...
7
by: Lionel B | last post by:
Greetings. The following code compiles ok and does what I'd expect it to do: ---------- START CODE ---------- // test.cpp
5
by: Levent | last post by:
Hi, Why doesn't this work? (tried with gcc 3.3.3 and VC++ 7.1): #include <iostream> template<class T, unsigned N> struct Foo { void func(); }; template<class T, unsigned N>
7
by: Kai-Uwe Bux | last post by:
Hi folks, I observed something that puzzles me. When I do namespace xxx { using std::swap; } it appears that xxx::swap and std::swap are not strictly equivalent. In particular, I think...
4
by: Erik Wikström | last post by:
In school (no I will not ask you to do my schoolwork for me) we talked about policy-based design and got an assignment where we got the a code- fragment from a stack-implementation. The idea with...
9
by: Gomaw Beoyr | last post by:
Two question about the "partial classes" (in the next wersion of ..NET). Question 1 ========== Will partial classes (in the next version of C#) have to be declared "partial" in ALL places. ...
4
by: wakun | last post by:
Hi there, I am learning template programming. When testing the partial specialization, I have some probelms Here is a full templated class template <typename T, int n> class CT { public: T...
6
by: wkaras | last post by:
I tried a couple of compilers, and both gave errors compiling this: template <bool fin, typename T> T foo(T val); template <typename T> T foo<true, T>(T val) { return(val); } But both gave...
9
by: Marek Vondrak | last post by:
Hello. I have written the following program and am curious why it prints "1" "2". What are the exact effects of explicitly providing function template parameters at the call? Is the second...
1
isladogs
by: isladogs | last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, Mike...
0
by: veera ravala | last post by:
ServiceNow is a powerful cloud-based platform that offers a wide range of services to help organizations manage their workflows, operations, and IT services more efficiently. At its core, ServiceNow...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
by: stefan129 | last post by:
Hey forum members, I'm exploring options for SSL certificates for multiple domains. Has anyone had experience with multi-domain SSL certificates? Any recommendations on reliable providers or specific...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.