2011-10-14 104 views
2

我已經在我的課像這樣一些方法:避免使用不同數據類型的代碼重複?

static std::string numberToString(int n); 
static std::string numberToString(float n); 
static std::string numberToString(double n); 
std::string encodeVector(const std::vector<int>& intVec); 
std::string encodeVector(const std::vector<float>& floatVec); 
std::string encodeVector(const std::vector<double>& doubleVec); 

的編碼方法取決於numberToString方法。

有沒有辦法讓這個更通用,避免代碼重複?

謝謝

回答

3

當然。 (警告:沒有編譯)

#include <sstream> 
#include <vector> 

// All types used in the to_string() function have to 
// have an appropriate operator << defined. 
template <class T> 
std::string to_string(const T& v) 
{ 
    std::stringstream out; 
    out << v; 
    return out.str(); 
} 

// generic for vector of any type T 
template <class T> 
std::string encodeVector(const std::vector<T>& vec) 
{ 
    std::string r; 

    for(size_t x = 0; x < vec.size(); ++x) 
     r += to_string(vec[x]); 

    return r; 
} 
0

當然,你總是可以讓你的函數的一個模板版本的類裏面,像這樣:

class myclass 
{ 
    template<typename T> 
    static typename std::enable_if<std::is_arithmetic<T>::value, std::string>::type numberToString(T n); 

    template<typename T> 
    typename std::enable_if<std::is_arithmetic<T>::value, std::string>::type encodeVector(const std::vector<T>& vec); 
}; 

使用的std::enable_if主要有防止有人將非算術類型傳遞給你的函數。您可以創建除std::is_arithmetic以外的其他謂詞來阻止或包含其他類型。