我的代码类似
template <typename T> void fun (T value)
{
.....
value.print (); //Here if T is a class I want to call print (),
//otherwise use printf
.....
}
现在,要打印该值,如果T是一个类,我想调用该对象的print函数,但如果T是基本数据类型,我只想使用printf。
那么,我如何找到模板类型是基本数据类型还是类?
答案 0 :(得分:6)
您可以使用std::is_class
(可能还有std::is_union
)。细节取决于您对“基本类型”的定义。详情了解类型支持here。
但请注意,在C ++中,通常会重载std::ostream& operator<<(std::ostream&, T)
来打印用户定义的类型T
。这样,您无需担心传递给函数模板的类型是否为类:
template <typename T> void fun (T value)
{
std::cout << value << "\n";
}
答案 1 :(得分:3)
建议为任何类型T
重叠operator<<(std::ostream&)
而不是使用printf()
:您如何知道要使用的格式说明符?
template <typename T> void fun (T value)
{
.....
std::cout << value << std::endl;
.....
}
FWIW,std::is_class
存在。
答案 2 :(得分:2)
如果您没有C ++ 11支持,可以选择其他方式。
template<typename T>
class isClassT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*);
template<typename C> static Two test(…);
public:
enum { Yes = sizeof(isClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};
一个简单的模板,用于查找type是否为类类型。更多C++ Templates a Complete Guide。
if (isClassT<T>::Yes) {
std::cout << " Type is class " << std::endl;
}
答案 3 :(得分:2)
我会使用打印助手功能模板/过载:
template <typename T>
void print(T const & t) { t.print(); }
template <typename U>
void print(U * p) { std::printf("%p", static_cast<void*>(p)); }
// we really an enable_if on is_object<U>::value here...
void print(char x) { std::printf("%c", x); }
void print(int x) { std::printf("%d", x); }
// etc. for all fundamental types
然后,您只需在代码中说出print(value);
即可。