2014-01-30 188 views
2

如果我想創建一個接受載體或初始化列表,所以像初始化列表C++ 11

void fun(const vector<int>& v); 
void fun(initializer_list<int> v); 

創建2個獨立的功能還是有一個函數我可以通過創建一個方式逃脫嗎?

編輯:

如果我想

void fun(const vector<vector<int>>& v); 

如果我通過這個功能

fun({{1, 2}, {3, 4}}); 

我得到一個錯誤。

+1

這些函數做不同的事情。一個取左值,另一個不取。 –

+0

我打算在它之前加一個const。固定。 – Opt

回答

4

是的,是這樣的:

#include <iostream> 
#include <vector> 
using namespace std; 

void fun(const vector<int>& v) 
{ 
    for (auto x = v.begin(); x != v.end(); ++x) cout << " " << *x; 
    cout << endl; 
} 

int main() 
{ 
    std::vector<int> foo { 4,5,6 }; 
    fun({1,2,3}); 
    fun(foo); 
} 

運行它

$ g++ -std=c++11 test.cpp 
$ ./a.out 
1 2 3 
4 5 6 
+1

該版本添加隱式轉換爲向量和不需要的分配 – galop1n

+0

如果我想void fun(const vector > & v);傳遞這個樂趣({{1,2},{3,4}});給我一個錯誤 – Opt

0

你應該選用標準庫的方式與迭代器養活函數的值的序列。如果需要,還可以添加包裝以便於使用矢量或初始化程序列表進行調用。

#include <iostream> 
#include <vector> 
#include <initializer_list> 

template <typename it__> 
void fun(it__ bgn, it__ end) { 
    while (bgn != end) 
    std::cout << " " << *bgn++; 
    std::cout << std::endl; 
} 

void fun(std::initializer_list<int> seq) { 
    fun(begin(seq), end(seq)); 
} 
void fun(std::vector<int> const & seq) { 
    fun(begin(seq), end(seq)); 
} 

int main() { 
    std::vector<int> foo { 4,5,6 }; 
    fun({1,2,3}); 
    fun(foo); 
}