2011-12-13 34 views
6

Tôi muốn kiểm tra xem đối số mẫu có thuộc loại tham chiếu hay không trong C++ 03. (Chúng tôi đã có is_reference trong C++ 11 và Tăng cường).Kiểm tra xem đối số mẫu có phải là tham chiếu [C++ 03]

Tôi đã sử dụng SFINAE và thực tế là chúng tôi không thể có con trỏ tham chiếu.

Đây là giải pháp của tôi

#include <iostream> 
template<typename T> 
class IsReference { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(C*); 
    template<typename C> static Two test(...); 
    public: 
    enum { val = sizeof(IsReference<T>::template test<T>(0)) == 1 }; 
    enum { result = !val }; 

}; 

int main() 
{ 
    std::cout<< IsReference<int&>::result; // outputs 1 
    std::cout<< IsReference<int>::result; // outputs 0 
} 

Bất kỳ vấn đề cụ thể với nó? Bất cứ ai có thể cung cấp cho tôi một giải pháp tốt hơn?

+1

Đối với đầy đủ bạn có thể thêm các trường hợp thử nghiệm cho con trỏ tham khảo, ví dụ: 'IsReference :: result'. – iammilind

Trả lời

7

Những năm trước đây, tôi đã viết này:

//! compile-time boolean type 
template< bool b > 
struct bool_ { 
    enum { result = b!=0 }; 
    typedef bool_ result_t; 
}; 

template< typename T > 
struct is_reference : bool_<false> {}; 

template< typename T > 
struct is_reference<T&> : bool_<true> {}; 

Đối với tôi nó có vẻ đơn giản hơn so với giải pháp của bạn.

Tuy nhiên, nó chỉ được sử dụng một vài lần và có thể thiếu một cái gì đó.

+0

Tôi muốn tránh chuyên môn hóa. Vẫn là một giải pháp tốt. Đã được upvoted. –

+0

@PrasoonSaurav: Tránh học? – GManNickG

+0

@GMan: Vì một số lý do * không rõ * tôi không thể chuyên lớp này: P [Đây chỉ là mục đích học tập và không liên quan gì đến mã thế giới thực]. –

15

Bạn có thể làm điều này dễ dàng hơn nhiều:

template <typename T> struct IsRef { 
    static bool const result = false; 
}; 
template <typename T> struct IsRef<T&> { 
    static bool const result = true; 
}; 
+0

+1 để đơn giản. –

+0

Có cách nào để làm tương tự mà không chuyên lớp? –

+0

@PrasoonSaurav, giải pháp này cung cấp cách thức rất đơn giản của SFINAE, vấn đề với chuyên môn hóa là gì, khi nó đảm bảo kết quả chính xác? Trong thực tế, bạn có thể mở rộng giải pháp này cho [tham chiếu giá trị r trong C++ 11] (http://www.ideone.com/JHThh). – iammilind

Các vấn đề liên quan