2012-11-16 47 views
8

一個基本的C++ 03枚舉類型是隻是一個奇特的名字的積分值,因此,我希望按值傳遞它....爲什麼boost :: call_traits <T> :: param_type是枚舉類型的引用?

爲此,我也期望boost::call_traits<T>::param_typeT=SomeEnum以確定最通過有效途徑T是按價值。

從升壓文檔看Call Traits

定義表示「最好」的方式類型T的參數傳遞給函數的類型。

當我使用boost::call_traits<T>::param_typeT=SomeEnum它確定SomeEnum應通過引用傳遞。

我也希望C++11 class enums也被傳遞的價​​值。

測試代碼:

#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

我稍微看了[code](http://www.boost.org/doc/libs/1_51_0/boost/detail/call_traits.hpp),並得出結論,這取決於['is_integral'](http://www.boost.org/doc/libs/1_51_0/boost/type_traits/is_integral.hpp),這對於枚舉是錯誤的。它專門針對所有整型類型都是真實的,對於其他所有類型都是錯誤的。我從來沒有真正想過,但我猜'enum'不能在模板中使用'int',即使它們可以在函數參數中使用。 – BoBTFish

+1

嘿,顯然這可以用boost ['is_enum'](http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html)來完成,如果他們想要:http://stackoverflow.com/questions/1619993/template-specialization-for-enum 所以也許這是一個故意的選擇?或者只是忽略了? – BoBTFish

+0

@BoBTFish模板中的'enum' /'int'是讓我感到沮喪的東西,提示這個問題....無論如何,我仍然期望'boost :: call_traits'來確定應該傳遞'enum'值,'boost :: call_traits'總是可以使用'boost :: is_enum'和'is_integral'。 – mark

回答

相關問題