Re: template specialization for pointer-to-type
".rhavin grobert" <clqrq@yahoo.de> a ?crit dans le message de news:
e272f287-de27-4d6f-bff1-d1f0813b69d0@k30g2000hse.googlegroups.com...
guess you have the following:
_________________________________________________
template <class T>
class CQVector
{
public:
// find an element, returns index or -1 if none is found
int find(int id) const;
private:
std::vector<T> m_vec;
};
template <class T>
int CQVector<T>::find(int id) const
{
int iCnt = m_vec.size();
while (iCnt-->0)
{
if (m_vec[iCnt].ID() == id)
break;
}
return iCnt;
}
_________________________________________________
this finds an element in the vector by calling elements fn ID() and
compiles for all structures/classes that have an ID() memeber-fn
returning something comparable to int.
now i also want the possibility to store pointers, eg
CQVector<MyClass*> m_foo;
and need some specialisation that does a...
_________________________________________________
int iCnt = m_vec.size();
while (iCnt-->0)
{
if (m_vec[iCnt]->ID() == id)
break;
}
return iCnt;
_________________________________________________
what syntax is need ed for the specialisation?
something like template<class*T> doesnt work...
TIA, -.rhavin;)
No need to partially specialize your class by the way. Here an example.
#include <boost/utility.hpp>
#include <boost/type_traits.hpp>
using namespace std;
//This template function will be called only if T is a pointer. return type
is int
template<typename T>
typename boost::enable_if_c<boost::is_pointer<T>::value, int>::type
Do() {return 1;}
//This template function will be called only if T is NOT a pointer. return
type is int
template<typename T>
typename boost::disable_if_c<boost::is_pointer<T>::value, int>::type
Do() {return 2;}
template<typename T>
class A
{
public:
int DoSomething()
{
return Do<T>(); // Do actually take careof doing the right thing
depending on T
}
};
int main()
{
A<int> a1;
A<int*> a2;
cout <<a1.DoSomething() <<endl; // print 2
cout <<a2.DoSomething() <<endl; // print 1
return 0;
}
Ok I agree that the Do<T> function template could look a little (ok maybe
not just a little...) strange at first sight but it is not actually that
bad.
take for example
boost::enable_if_c<boost::is_pointer<T>::value, int>::type
there is 2 template arg to enable_if_c
1.boost::is_pointer<T>::value
2. int