частичная специализация шаблонов в с ++ - PullRequest
2 голосов
/ 10 января 2011

возможно ли в c ++ сделать что-то подобное:

template<class T1, class T2>
  class A<T1*, T2> {
    T1* var;
    T2 var1;

};

template<class T1, class T2>
  class A<T1, T2*> {
    T1 var;
    T2* var1;

};

На самом деле я хочу знать, могу ли я достичь перегрузки шаблона, когда два класса имеют одно и то же имя, но разные аргументы в шаблоне, спасибо ваванс за любую хорошую идею

Ответы [ 2 ]

6 голосов
/ 10 января 2011

Это известно как частичная специализация шаблона

template<class T1, class T2>
class A;

template<class T1, class T2>
class A<T1*, T2> {
    T1* var;
    T2 var1;
};

template<class T1, class T2>
class A<T1, T2*> {
    T1 var;
    T2* var1;
};

Конечно, вам нужен третий, чтобы A<T1*, T2*> был безопасным. В противном случае вы получите двусмысленность обоих указателей.

1 голос
/ 10 января 2011

Если вы хотите узнать тип без указателя, вы можете использовать boost::type_traits:

#include <boost/type_traits.hpp>

template<class T1, class T2>
class A {
  typedef boost::remove_pointer<T1>::type T1_type;
  typedef boost::remove_pointer<T2>::type T2_type;
  T1_type *var;
  T2_type *var1;
};

remove_pointer, шаблон легко написать самостоятельно:

template<class T> 
struct remove_pointer{
  typedef T type;
};

template<class T>
struct remove_pointer<T*>{
  typedef T type; 
  //or even 
  typedef remove_pointer<T>::type type;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...