确定C ++中的类型是否为同一基础类型的别名

时间:2011-01-09 23:09:28

标签: c++ templates types

我想写一个模板化的函数,它根据传入的模板类类型改变它的行为。为此,我想确定传入的类型。例如,像这样:

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 个答案:

答案 0 :(得分:8)

这是模板专业化的目的,对该术语的搜索提供了大量的例子。

#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");
}

答案 1 :(得分:2)

通过使用部分特化的强大功能,可以在编译时完成:

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");
    }
}

在我的头脑中编译,但应该继续工作。

答案 2 :(得分:1)

使用模板特化或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
}

答案 3 :(得分:0)

直接使用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 );
}