避免使用不同数据类型的代码重复?

时间:2011-10-14 23:06:24

标签: c++

我班上有这样的方法:

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);

encode方法取决于numberToString方法。

有没有办法让这更通用,避免代码重复?

由于

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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之外的另一个谓词来阻止或包含其他类型。