繁体   English   中英

是否可以将字符串重载为char元素的向量?

[英]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重载的附加方法。 我觉得这是一个不必要的开销,有时也会忘记添加它。

我将在字符串上完成与在相应向量上完全相同的事情 - 在两种情况下都会调用相同的方法,相同的迭代等等。因此,我想知道是否有更简洁的方法来做到这一点,没有添加很多代码开销。 在那儿?

一种可能的方法是将您的方法实现为模板,其参数不限于stringvector<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM