2008-11-19 11 views
28

अगर मैं एक टेम्पलेट समारोह, उदाहरण के लिए इस तरह है:यदि प्रकार एक टेम्पलेट समारोह में एक सूचक है

template<typename T> 
void func(const std::vector<T>& v) 

वहाँ किसी भी तरह से मैं समारोह है कि क्या टी है के भीतर एक सूचक निर्धारित कर सकते हैं, या होगा मैं, इस के लिए एक और टेम्पलेट समारोह का उपयोग करने के अर्थात्:

template<typename T> 
void func(const std::vector<T*>& v) 

धन्यवाद

+0

हैं, जैसे मैं, आप एक ऐसे फ़ंक्शन का उपयोग करना चाहते हैं जो 'टी' सूचक है या नहीं, इस पर निर्भर करता है कि आप यह उत्तर बहुत उपयोगी पा सकते हैं: http://stackoverflow.com/questions/14466620/c-template- specialization- बुला-तरीकों-ऑन-प्रकार-टी टोपी-हो सकता है-पॉइंटर्स- या/14466705 – davidhood2

उत्तर

77

दरअसल, टेम्पलेट्स ऐसा कर सकते हैं, आंशिक टेम्पलेट विशेषज्ञता के साथ:

0,123,
template<typename T> 
struct is_pointer { static const bool value = false; }; 

template<typename T> 
struct is_pointer<T*> { static const bool value = true; }; 

template<typename T> 
void func(const std::vector<T>& v) { 
    std::cout << "is it a pointer? " << is_pointer<T>::value << std::endl; 
} 

यदि फ़ंक्शन में आप केवल पॉइंटर्स के लिए मान्य होते हैं, तो आप बेहतर फ़ंक्शन की विधि का बेहतर उपयोग करते हैं, क्योंकि कंपाइलर पूरी तरह से फ़ंक्शन को चेक-चेक करता है।

हालांकि, आप इस बात के लिए बढ़ावा का उपयोग करना चाहिए, यह भी शामिल है भी कि: http://www.boost.org/doc/libs/1_37_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html

+0

+1 यह वास्तव में सही उत्तर है :) –

+0

अच्छा उत्तर धन्यवाद - रॉब स्टेनली –

+0

हाँ, वास्तव में अच्छा जवाब, मैं केवल 1. –

32

सी ++ 11 एक अच्छी छोटी सूचक जांच

में बनाया गया है से http://en.cppreference.com/w/cpp/types/is_pointer

#include <iostream> 
#include <type_traits> 

class A {}; 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << std::is_pointer<A>::value << '\n'; 
    std::cout << std::is_pointer<A*>::value << '\n'; 
    std::cout << std::is_pointer<float>::value << '\n'; 
    std::cout << std::is_pointer<int>::value << '\n'; 
    std::cout << std::is_pointer<int*>::value << '\n'; 
    std::cout << std::is_pointer<int**>::value << '\n'; 
} 
संबंधित मुद्दे