如何确定模板类型是基本类型还是类

时间:2013-04-21 14:22:35

标签: c++ templates types

我的代码类似

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。

那么,我如何找到模板类型是基本数据类型还是类?

4 个答案:

答案 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);即可。