2017-03-08 52 views
1

在pre C++ 11的標準庫中,有沒有什麼辦法可以從類似std::initializer_list的對象中創建類構造函數,這在像支持列表初始化那樣工作時會像std::initializer_list那樣工作?在C++ 11之前模擬加載列表初始化STL

可以使用C++ 11(甚至C++ 14)的語言功能。但是,對於一些項目,我仍然在Xcode上使用libstdC++,因爲我需要支持OS X 10.6,所以它沒有C++ 11的支持。

+1

如果您的課程是[聚合](http://en.cppreference.com/w/cpp/language/aggregate_initialization)。否則,不。 –

+3

你可以很容易地創建一個模擬'std :: initializer_list'類的類,但是***加強列表初始化是編譯器的一部分,而不是標準庫。編譯器採用支撐初始化器列表並創建'std :: initializer_list'對象。 –

+1

如果沒有在C++ 11中添加的語言支持來實現它,我看不到一種方法。當然,boost有一個「解決方案」:http://www.boost.org/doc/libs/1_52_0/libs/assign/doc/index.html – NathanOliver

回答

1

你的問題是你有C++ 11作爲語言功能,但標準庫不支持它。所以你問你是否可以構建從initializer_list s的容器。

是的,但它不會有相同的語法。這個函數就足夠了:

template<typename Container> 
Container from_list(std::initializer_list<typename Container::value_type> il) 
{ 
    return Container(il.begin(), il.end()); 
} 

auto vec = from_list<std::vector<int>>({1, 2, 3, 4, 5}); 

標準庫容器具有與迭代器對一起工作的構造函數。所以這應該適用於任何這樣的容器。

但是,這假設標準庫實際上有initializer_list類型。如果沒有,那麼你的運氣不好。

+0

在Xcode附帶的pre-C++ 11 stdlibC++中沒有std :: initializer_list。 – Danra

+0

@Danra:「*如果沒有,那麼你的運氣不好。*」 –