2008-11-19 32 views
28

Nếu tôi có một hàm mẫu, ví dụ như thế này:Xác định xem Type là một con trỏ trong một mẫu chức năng

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

Có cách nào tôi có thể xác định trong phạm vi chức năng dù T là một con trỏ, hoặc sẽ tôi phải sử dụng một mẫu chức năng cho điều này, ví dụ:

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

Cảm ơn

+0

Nếu như tôi, bạn muốn sử dụng một chức năng có thể khác nhau tùy thuộc vào việc 'T' là một con trỏ hay không, bạn có thể tìm thấy câu trả lời này rất hữu ích: http://stackoverflow.com/questions/14466620/c-template-specialization- gọi-phương thức-trên-loại-t hat-can-be-pointers-hoặc/14466705 – davidhood2

Trả lời

77

Trên thực tế, các mẫu có thể làm điều đó, với một phần mẫu chuyên môn:

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

Nếu trong hàm bạn làm mọi thứ chỉ hợp lệ với con trỏ, tốt hơn bạn nên sử dụng phương thức của hàm riêng biệt, vì kiểu trình biên dịch kiểm tra toàn bộ hàm.

Bạn nên, tuy nhiên, sử dụng tăng cho điều này, nó bao gồm điều đó quá: http://www.boost.org/doc/libs/1_37_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html

+0

+1 đây là câu trả lời đúng thực sự :) –

+0

Câu trả lời hay - Rob Stanley –

+0

Yup, câu trả lời hay, tôi chỉ có thể thêm 1. –

32

C++ 11 có một tấm séc ít con trỏ đẹp được xây dựng trong

Từ 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'; 
} 
Các vấn đề liên quan