2012-11-16 20 views
8

Một cơ bản C++ 03 kiểu liệt kê chỉ là một giá trị không thể thiếu với một tên ưa thích, vì thế tôi mong chờ để vượt qua nó bằng giá trị ....Tại sao tăng :: call_traits <T> :: param_type một tham chiếu cho các loại được liệt kê?

Vì lý do này, tôi cũng mong chờ boost::call_traits<T>::param_type với T=SomeEnum để xác định rằng hầu hết cách vượt qua hiệu quả T là giá trị.

Từ tài liệu thúc đẩy thấy Call Traits:

Định nghĩa một loại đại diện cho cách "tốt nhất" để vượt qua một tham số có kiểu T để một hàm.

Khi tôi sử dụng boost::call_traits<T>::param_type với T=SomeEnum, xác định rằng SomeEnum phải được chuyển qua tham chiếu.

Tôi cũng mong đợi C++11 class enums cũng được chuyển theo giá trị.

Kiểm tra Code:

#include <string> 
#include <typeinfo> 
#include <boost/call_traits.hpp> 
#include <boost/type_traits/is_reference.hpp> 

enum SomeEnum 
{ 
    EN1_ZERO = 0, 
    EN1_ONE, 
    EN1_TWO, 
    EN1_THREE 
}; 

struct SomeStruct 
{}; 

template<typename T> 
void DisplayCallTraits(const std::string& desc) 
{ 
    typedef typename boost::call_traits<T>::param_type param_type; 
    std::cout << "-----------------------------------------------------\n"; 
    std::cout << "Call traits for: " << desc << "\n"; 
    std::cout << "\ttypeof T : " << typeid(T).name() << "\n"; 
    std::cout << "\ttypeof param_type : " << typeid(param_type).name() << "\n"; 
    std::cout << "\tis_reference<param_type> : " << std::boolalpha 
       << boost::is_reference<param_type>::value << "\n"; 
} 

int main(int, char**) 
{ 
    DisplayCallTraits<unsigned>("unsigned");  // pass by value, as expected 
    DisplayCallTraits<SomeStruct>("struct");  // pass by reference, as expected 
    DisplayCallTraits<SomeEnum>("enumeration"); // pass by reference - why? 

    return 0; 
} 
+1

Tôi đã xem qua [code] (http://www.boost.org/doc/libs/1_51_0/boost/detail/call_traits.hpp), và đi đến kết luận rằng nó phụ thuộc vào ['is_integral'] (http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp), đó là sai cho enums. Nó là chuyên ngành cho tất cả các loại tích phân là đúng, và sai cho mọi thứ khác. Tôi chưa bao giờ thực sự nghĩ về nó trước đây, nhưng tôi đoán 'enum' không thể là 'int' trong các mẫu, mặc dù chúng có thể trong các đối số hàm. – BoBTFish

+1

Heh, dường như điều này có thể được thực hiện bằng cách tăng ['is_enum'] (http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html) nếu chúng muốn: http://stackoverflow.com/questions/1619993/template-specialization-for-enum Vì vậy, có lẽ đó là một sự lựa chọn có chủ ý? Hoặc chỉ cần bỏ qua? – BoBTFish

+0

@BoBTFish các 'enum' /' int' trong các mẫu là một cái gì đó đã vấp tôi lên, nhắc câu hỏi này .... anyway tôi vẫn sẽ mong đợi 'boost :: call_traits' để xác định rằng một' enum' nên được thông qua value, 'boost :: call_traits' luôn có thể sử dụng' boost :: is_enum' cũng như 'is_integral'. – mark

Trả lời

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