我想写一个模板化的函数,它根据传入的模板类类型改变它的行为。为此,我想确定传入的类型。例如,像这样:
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");
}
}
这可能吗?
答案 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 );
}