8
一個基本的C++ 03枚舉類型是隻是一個奇特的名字的積分值,因此,我希望按值傳遞它....爲什麼boost :: call_traits <T> :: param_type是枚舉類型的引用?
爲此,我也期望boost::call_traits<T>::param_type
與T=SomeEnum
以確定最通過有效途徑T
是按價值。
從升壓文檔看Call Traits:
定義表示「最好」的方式類型T的參數傳遞給函數的類型。
當我使用boost::call_traits<T>::param_type
與T=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;
}
我稍微看了[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
嘿,顯然這可以用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
@BoBTFish模板中的'enum' /'int'是讓我感到沮喪的東西,提示這個問題....無論如何,我仍然期望'boost :: call_traits'來確定應該傳遞'enum'值,'boost :: call_traits'總是可以使用'boost :: is_enum'和'is_integral'。 – mark