2011-11-28 47 views
2

好吧,這對我的編譯器(vs2008)有效,但我試圖弄清楚我是否在做非標準的事情。這裏有一個簡單的例子,我在做什麼:返回一個匿名tr1數組,初始化boost.assign

std::tr1::array<int, 3> OneTwoThree() { 
    return boost::assign::list_of(1)(2)(3).to_array(std::tr1::array<int, 3>()); 
} 

我身邊的事實,to_array適配器不實際使用你進入它的說法欺騙,它只是用它來找出類型。這些例子,但是,顯示它正在使用更多的是這樣的:

std::tr1::array<int, 3> a = boost::assign::list_of(1)(2)(3).to_array(a); 

任何想法就是否只是扔值初始化數組to_array它是猶太?有沒有更乾淨的方法來做到這一點?

回答

3

to_...成員函數都需要一個參數,但只能用作模板參數推導協助,所以是的目的,通過你想要的返回類型是安全的相同類型的值初始化例如,雖然不必要效率低下。

但是,to_...成員函數僅用於幫助沒有正確支持模板轉換運算符的破碎編譯器 - 爲什麼您首先使用它們?乾淨的語法是簡單的:

boost::array<int, 3> OneTwoThree() { 
    return boost::assign::list_of(1)(2)(3); 
} 

請注意,我用boost::array<>而不是在這裏std::tr1::array<>;原因是Boost.Assign庫沒有TR1/C++ 11標準庫的知識,因此不適用於std::array<>std::tr1::array<>。要添加自己這個專業化,從而使上面的代碼工作,std::tr1::array<>,添加以下代碼後,包括Boost.Assign標題:

namespace boost { namespace assign_detail { 

template<typename T, std::size_t sz> 
type_traits::yes_type assign_is_array(std::tr1::array<T, sz> const*); 

}} 

(注:只有加速測試1.48;早期版本可能需要不同的專業化。)


在你的問題不是默認施工的語法,它的值初始化。

+0

對,我使用to_array成員來解決缺乏對tr1 :: array的支持。我打算用你建議的專業化,謝謝。編輯問題說價值初始化。 –