2013-04-21 103 views
3

我的代碼是這樣的如何確定的模板類型是基本型或類

template <typename T> void fun (T value) 
{ 
    ..... 
    value.print(); //Here if T is a class I want to call print(), 
        //otherwise use printf 
    ..... 
} 

現在,打印的值,如果T是一個類,我想調用打印功能的對象,但如果T是一個基本的數據類型,我只想使用printf。

那麼,如何找到模板類型是基本數據類型還是類?

+3

你打算使用哪種格式的字符串作爲基本類型? – Xeo 2013-04-21 14:24:58

回答

5

您可以使用std::is_class(也可能是std::is_union)。細節取決於您對「基本類型」的定義。有關支持類型的更多信息,請參閱here

但請注意,在C++中,打印用戶定義類型T時通常會重載std::ostream& operator<<(std::ostream&, T)。這樣,你不需要擔心傳遞給你的函數模板類型是否是類或不:

template <typename T> void fun (T value) 
{ 
    std::cout << value << "\n"; 
} 
+2

+1我幾乎可以在這裏「我怎麼用這個」火車來了。同上hmjd的答案。 (和兩者都+1)。 – WhozCraig 2013-04-21 14:27:25

+0

@WhozCraig正確,答案就是「你不要,你輸出流操作符超載......」 – juanchopanza 2013-04-21 14:33:29

+0

同意。 (填料)。 – WhozCraig 2013-04-21 14:37:29

3

推薦超載operator<<(std::ostream&)任何類型T,而不是使用printf():你怎麼會知道是什麼格式說明使用?

template <typename T> void fun (T value) 
{ 
    ..... 
    std::cout << value << std::endl; 
    ..... 
} 

FWIW,std::is_class存在。

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