我班上有这样的方法:
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方法。
有没有办法让这更通用,避免代码重复?
由于
答案 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
之外的另一个谓词来阻止或包含其他类型。