2012-06-06 36 views
5

Tôi đang đưa ra tùy chọn để biên dịch chương trình với một trong hai loại float hoặc double, nhưng có một vấn đề: tôi cần phải tự đặt GL_FLOAT hoặc GL_DOUBLE, bởi vì tôi không biết làm thế nào tôi có thể làm như sau:Làm thế nào để kiểm tra loại trên thời gian biên dịch

typedef float MYTYPE; 

#if MYTYPE == float 
    #define GL_MYTYPE GL_FLOAT // used for vertex array parameters. 
#else 
    #define GL_MYTYPE GL_DOUBLE 
#endif 

Lưu ý: Tôi không có C++ 11 hoặc bất cứ thứ gì, chỉ cũ C++.

Trả lời

1

Bạn có thể làm theo cách này:

#define MYFLOAT 

#ifdef MYFLOAT 
    typedef float MYTYPE; 
    #define GL_MYTYPE GL_FLOAT // used for vertex array parameters. 
#else 
    typedef double MYTYPE; 
    #define GL_MYTYPE GL_DOUBLE 
#endif 

Bạn sẽ cần phải xác định MYFLOAT nếu bạn muốn sử dụng float, hoặc bỏ qua nó để sử dụng double.

PS: lưu giữ trong trường hợp này không được đánh giá tại thời gian biên dịch, nhưng ở thời gian xử lý trước.

+0

ah, điều đó có ý nghĩa hơn các loại kiểm tra. – Rookie

2

#define s được xử lý bởi bộ tiền xử lý trước khi trình biên dịch chạy. Vì vậy, nó không nhìn thấy typedef.

0

Bạn có thể sử dụng #ifdef như sau:

#ifdef DOUBLE 
    #define GL_MYTYPE GL_FLOAT 
    //or 
    typdef ... 
#endif 

#ifdef FLOAT 
    #define GL_MYTYPE GL_DOUBLE 
    //or 
    typdef ... 
#endif 

Bạn phải biên dịch mã của bạn với DOUBLE hoặc FLOAT như symblos xác định.

2

macro Sử dụng tiền xử lý để thay đổi những gì dòng typedef của bạn không

#if defined(TYPE_IS_FLOAT) 
typedef float MYTYPE; 
#else 
typedef double MYTYPE; 
#end 

Và sau đó sử dụng hệ thống xây dựng của bạn để thiết lập TYPE_IS_FLOAT như thích hợp (và cung cấp cho nó một cái tên tốt hơn tất nhiên).

Hoặc bọc tất cả mã hoạt động như thế này trong lớp mẫu và sử dụng thông số mẫu cho loại này, sau đó sử dụng phiên bản nào phù hợp vào thời điểm đó.

9

Trong C++ 11, bạn có thể sử dụng std::conditionalstd::is_same như:

#define GL_MYTYPE std::conditional      \ 
        < std::is_same<MYTYPE,float>::value, \ 
         GL_FLOAT,       \ 
         GL_DOUBLE       \ 
        >::type        

Trong C++ 03, bạn có thể thực hiện các chức năng bản thân như:

template<bool B, class T, class F> 
struct conditional { typedef T type; }; 

template<class T, class F> 
struct conditional<false, T, F> { typedef F type; }; 

template<class T, class U> 
struct is_same { static const bool value = false; }; 

template<class T> 
struct is_same<T, T> { static const bool value = true; }; 

Lưu ý rằng việc triển khai conditional được lấy từ site.

0

Tôi nghĩ Nawaz's answergần chính xác. Trong trường hợp đặc biệt chọn giữa GL_FLOATGL_DOUBLE, std::conditional là không cần thiết. Chỉ cần sử dụng một ternary if:

#define GL_MYTYPE std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE 

Điều này là do GL_FLOATGL_DOUBLE không loại, mà là nghĩa đen GLenum giá trị. Vì vậy, GL_MYTYPE cũng không được là tên tệp nhưng là GLenum.Vì vậy, tôi muốn sử dụng:

const GLenum GL_MYTYPE = std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE; 
Các vấn đề liên quan