2011-06-09 74 views
2

有什麼辦法強制函數只接受整數的向量(int,unsigned int,uint32_t等),只有那些?即時通訊編程嘗試寫一個簡單的函數返回所有值的相同返回類型的總和(因爲我不能確定該值是否會大於(2^32 - 1)。但是,因爲std::vector<T>沒有因爲它會返回一個向量(忽略vector +向量不起作用的事實),我不希望每種類型都重載,因爲我不需要它。想要的功能工作時,T是某種形式的int(以及浮動如果可能)使用try/except強制一個函數只接受一組特定的數據類型

IVE試過,但碼塊捕捉類型的運營商,所以,如果我做sum(vector <vector <T> >)

template <typename T> 
T sum(std::vector <T> in){ 
    try{ 
     T total = 0; 
     for(int x = 0; x < in.size(); x++) 
      total += in[x]; 
     return total; 
    } 
    catch (int e){ 
     std::cout << "Error " << e << " has occured." << std::endl; 
     exit(e); 
    } 
} 
我不能編譯
+0

如果'T'爲一個整數類型,這是不可能的'int'在你的代碼拋出。 – 2011-06-09 04:52:52

+0

我不熟悉使用try/catch – calccrypto 2011-06-09 05:11:04

+2

我建議不要使用它們,直到你知道它們是什麼。作爲一個經驗法則,代碼越少越好。 – 2011-06-09 05:16:57

回答

2

SFINAE來救援。

#include <type_traits> 
//#include <tr1/type_traits> // for C++03, use std::tr1:: 

template<bool, class T = void> 
struct enable_if{}; 

template<class T> 
struct enable_if<true,T>{ 
    typedef T type; 
}; 

template<class T> 
typename enable_if< 
    std::is_arithmetic<T>::value, 
    T 
>::type sum(std::vector <T> in){ 
    T total = 0; 
    for(int x = 0; x < in.size(); x++) 
     total += in[x]; 
    return total; 
} 
+2

不必要的宏,真的 – Puppy 2011-06-09 04:55:21

+0

這兩個解決方案都給我錯誤'error:'enable_if'在命名空間'std'中沒有命名一個類型' – calccrypto 2011-06-09 05:16:47

+0

@calccrypto您是否包含'',因爲它出現在Xeo的答案中?你的編譯器C++ 0x是否知道? – 2011-06-09 05:20:03

3
template <typename T> 
typename std::enable_if< 
    std::is_integral<typename std::remove_reference<T>::type>::value, 
    T>::type 
sum(const std::vector<T>& in) { return std::accumulate(in.begin(), in.end(), 0); } 
+2

不能有引用的「std :: vector」(不會導致代碼無效)。 – 2011-06-09 05:02:57

+0

@Luc:對,一次又一次地輸入這些東西后,它變得幾乎是自動的:) – 2011-06-09 06:00:45

相關問題