[英]is it possible to overload a string as a vector of char elements?
我有一个类作用于元素列表,如下所示:
template <typename T>
class MyClass {
...
};
我需要实现某些方法,这些方法同时适用于vector<T>
和string
- 这是大多数用户在将对象初始化为MyClass<char>()
时将使用的方法。
由于这个原因,我被迫遵循这种重载模式:
void method(vector<T> elements){
}
void method(string elements){
method(convertStringToVector(elements));
}
其中vector<char> convertStringToVector(string str)
定义为预期。
也就是说,对于每个类方法,我都被迫添加一个为string
重载的附加方法。 我觉得这是一个不必要的开销,有时也会忘记添加它。
我将在字符串上完成与在相应向量上完全相同的事情 - 在两种情况下都会调用相同的方法,相同的迭代等等。因此,我想知道是否有更简洁的方法来做到这一点,没有添加很多代码开销。 在那儿?
一种可能的方法是将您的方法实现为模板,其参数不限于string
或vector<char>
。
template <typename T>
struct MyClass
{
template <class C>
void method(C container);
};
这解决了您的问题,因为一种实现对于两种情况都足够了:
template <typename T>
template <class C>
void MyClass<T>::method(C container)
{
std::cout << "Container has size " << container.size() << '\n';
std::cout << "First element is " << container[0] << '\n';
}
但是,这适用于任何容器。 目前尚不清楚这是好的(代码是通用的)还是坏的(代码允许不合需要的实例化)。
想象一下当人们试图错误地将vector<int>
而不是vector<char>
发送到您的方法时会发生什么。 因为您没有为这种情况构建代码,所以它将显示模糊的编译错误,或生成在运行时静默执行错误操作的代码。
您可以创建一个类作为方法的参数,它接受std::vector<char>
和std::string
:
class MyString
{
public:
MyString(const std::vector<char>& v) : vector(v) {}
MyString(std::vector<char>&& v) : vector(std::move(v)) {}
MyString(const std::string& s) : vector(convertStringToVector(s)) {}
std::vector<char> vector;
};
void method(MyString elements)
{
}
您可以将convertStringToVector
定义为类的方法,如下所示:
vector<T> convertStringToVector(string str)
或者单独的模板函数,如果您需要为其他类独立使用它。
我也将参数作为参考const string &str
传递。
如果您使用的任何模板参数与算法不兼容,编译器将告诉您。
对于这些特殊情况,您仍然可以编写如下模板专业化:
template<>
vector<SPECIALTYPE> convertStringToVector<SPECIALTYPE>(string str)
{
...
}
并为这种SPECIALTYPE
实现不同的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.