Как проверить, имеет ли параметр шаблона функции определенный тип? - PullRequest
9 голосов
/ 04 октября 2011

Скажем, у меня есть функция с шаблоном типа T и двумя другими классами A и B .

template <typename T>
void func(const T & t)
{
    ...........
    //check if T == A do something
    ...........
    //check if T == B do some other thing
}

Как я могу сделать эти две проверки (без использования библиотеки Boost)?

Ответы [ 3 ]

9 голосов
/ 04 октября 2011

Если вы буквально хотите, чтобы логическое значение проверяло, является ли T == A, тогда вы можете использовать is_same, доступный в C ++ 11 как std::is_same, или до TR1 как std::tr1::is_same:

const bool T_is_A = std::is_same<T, A>::value;

Вы можете тривиально написать этот маленький класс самостоятельно:

template <typename, typename> struct is_same { static const bool value = false;};
template <typename T> struct is_same<T,T> { static const bool value = true;};

Часто вам может оказаться удобнее упаковать код ветвления в отдельные классы или функции, которые вы специализируете для AB, поскольку это даст вам условное время компиляции .В отличие от этого, проверка if (T_is_A) может быть выполнена только во время выполнения.

7 голосов
/ 04 октября 2011

Создайте шаблоны функций со специализациями, которые будут делать то, что вы хотите.

template <class T>
void doSomething() {}

template <>
void doSomething<A>() { /* actual code */ }

template <class T>
void doSomeOtherThing() {}

template <>
void doSomeOtherThing<B>() { /* actual code */ }

template <typename T>
void func(const T & t)
{
    ...........
    //check if T == A do something
    doSomething<T>();
    ...........
    //check if T == B do some other thing
    doSomeOtherThing<T>();
}
3 голосов
/ 04 октября 2011

Если вы хотите иметь специальную реализацию func для некоторого типа параметра, просто создайте перегрузку, специфичную для этого типа:

template <typename T>
void func(const T & t) {
   // generic code
}

void func(const A & t) {
   // code for A
}
...