Определение, является ли тип псевдонимом для того же базового типа в C ++ - PullRequest
2 голосов
/ 10 января 2011

Я хотел бы написать шаблонную функцию, которая меняет свое поведение в зависимости от переданных типов шаблонных классов. Для этого я бы хотел определить переданный тип. Например, что-то вроде этого:

template <class T>
void foo() {
  if (T == int) { // Sadly, this sort of comparison doesn't work
    printf("Template parameter was int\n");
  } else if (T == char) {
    printf("Template parameter was char\n");
  }
}

Возможно ли это?

Ответы [ 4 ]

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

Это цель специализации шаблонов, поиск по этому термину дает множество примеров.

#include <iostream>

template <typename T>
void foo() 
{ 
    std::cout << "Unknown type " << typeid(T).name() << "\n";
}

template<typename T>
void fooT(T const& x) { foo<T>(); }

template<>
void foo<int>()
{    printf("Template parameter was int\n");
}

template<>
void foo<char>()
{    printf("Template parameter was char\n");
}

int main()
{
    fooT(std::cout);
    fooT(5);
    fooT('a');
    fooT("Look Here");
}
2 голосов
/ 10 января 2011

Используя силу частичной специализации, это можно сделать во время компиляции:

template<class T, class U>
struct is_same_type
{
    static const bool value = false;
};
template<class T>
struct is_same_type<T, T>
{
    static const bool value = true;
};

template <class T>
void foo() 
{
    if (is_same_type<T, int>::value) 
    {
        printf("Template parameter was int\n");
    }
    else if (is_same_type<T, char>::value) 
    {
        printf("Template parameter was char\n");
    }
}

Скомпилировано в моей голове, но, тем не менее, должно работать.

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

Использование специализации шаблона или typeid, вероятно, будет работать для вас, хотя вы можете предпочесть специализацию шаблона, так как это не повлечет за собой затрат времени выполнения typeid.Например:

#include <iostream>
#include <typeinfo>

template <typename T>
void foo(T arg) {
  if (typeid(arg) == typeid(int)) std::cout << "foo<T> where T is int\n";
  else if (typeid(arg) == typeid(double)) std::cout << "foo<T> where T is double\n";
  else if (typeid(arg) == typeid(char)) std::cout << "foo<T> where T is char\n";
}

template <>
void foo<int>(int arg) {
  std::cout << "foo<int>\n";
}

int main() {
  foo(3);   // foo<int>
  foo(3.0); // foo<T> where T is double
  foo('c'); // foo<T> where T is char
}
0 голосов
/ 10 января 2011

Используйте type_info напрямую или, еще лучше, оператор typeid, чтобы сделать это.

#include <typeinfo>
template < typename T > 
T max( T arg1, T arg2 ) {
   cout << typeid( T ).name() << "s compared." << endl;
   return ( arg1 > arg2 ? arg1 : arg2 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...