2012-07-18 19 views
2

如何確保傳遞給可變模板函數的所有容器都具有相同的大小?

#include <vector> 
#include <cassert> 

template <typename Cont, typename... Rest> 
void f(Cont& c, Rest&... rest) 
{ 
    assert(c.size() == ???); 
} 


int main() 
{ 
    std::vector<int> v1(10); 
    std::vector<int> v2(10); 
    std::vector<int> v3(10); 
    std::vector<int> v4(10); 

    f(v1, v2, v3, v4); 
} 

我想,以確保傳遞給函數的所有容器的大小相同。但是,該函數是一個可變參數模板,可以接受任意數量的相同類型的容器。這可能嗎?

+1

提示:你會如何寫一個帶有三個參數的'f'? – aschepler 2012-07-18 21:42:02

+0

@aschepler:謝謝你的提示,這對我有很大的幫助。 – 2012-07-18 21:46:23

回答

7
#include <vector> 
#include <cassert> 

template <typename Size> 
bool check_size(Size) { 
    return true; 
} 

template <typename Size, typename Cont, typename... Rest> 
bool check_size(Size expected, Cont& c, Rest&... rest) { 
    return (c.size() == expected && check_size(expected, rest...)); 
} 

template <typename Cont, typename... Rest> 
void f(Cont& c, Rest&... rest) 
{ 
    assert(check_size(c.size(), rest...)); 
} 

int main() 
{ 
    std::vector<int> v1(10); 
    std::vector<int> v2(10); 
    std::vector<int> v3(10); 
    std::vector<int> v4(10); 

    f(v1, v2, v3, v4); 
} 
0

標準範例是「第一,休息」模板。所以你要聲明一個驗證模板函數,該函數接受第一個參數(一個帶有size()成員的容器)和一個「rest」參數(可變參數部分),並返回有效休息列表中的元素數目或一個數字在設置之外(例如-1)出現錯誤。一個單獨的validate()模板只需要一個參數,並在事件rest中選擇一個單個元素;它只會返回元素的大小。

但是... y。這裏的目標是什麼?

+0

該函數將創建一個迭代器容器,其中包含傳入的所有容器的迭代器。 – 2012-07-18 21:51:11

+0

我想這似乎是理智的。無論如何,用戶體驗都很乾淨。上面的MvG和Vlad在這條線上似乎都有正確的解決方案。我懶得編碼。 – 2012-07-18 21:57:09

+0

啊,懶惰:程序員最大的障礙。 – chris 2012-07-18 22:08:45

0

像這樣的東西應該做的(我沒有檢查,手頭沒有編譯)

template <typename Cont, typename... Rest> 
void assertAllOfSize(int size, Cont& first, Rest&... rest) 
{ 
    assert(first.size() == size); 
    assertAllOfSize(size, rest...); 
} 

template <typename Cont, typename... Rest> 
void assertAllEqualSize(Cont& first, Rest&... rest) 
{ 
    assertAllOfSize(first.size(), rest...); 
} 

template <typename Cont> // terminate recursion 
void assertAllOfSize(int size, Cont& first) 
{ 
    assert(first.size() == size); 
} 
0

您可以使用「通常」的模式,但有命名參數:

template <typename ...Args> bool AllTheSame(Args &&...) { return true; } 

template <typename A, typename B, typename ...Rest> 
bool AllTheSame(A && a, B && b, Rest &&... rest) 
{ 
    return a.size() == b.size() && 
      AllTheSame(std::forward<B>(b), std::forward<Rest>(rest)...); 
} 
+0

僅適用於容器數量相同的情況,否則會在最後一個尺寸不一致的情況下使用結果。 – Xeo 2012-07-18 22:13:45

+0

@Xeo:這是怎麼回事?你能舉一個(計數器)的例子嗎? – 2012-07-19 07:18:07

+0

爲什麼在這裏使用右值引用的任何特定原因?使代碼難以閱讀,使得打電話者擔心他們是否會丟失數據,我看不出任何收益。 – MvG 2012-07-20 17:33:37

相關問題