我们可以使用自定义函数扩展现有类吗? (没有继承)

时间:2015-03-21 12:55:44

标签: c++ class methods

我正在寻找一种使用自定义成员方法扩展C ++类的方法。就像C#使用Linq扩展一样:

public static class Factory
{
    public static int getIndex(this List<int> source, int value)
    {
        int index = 0;
        foreach (int item in source)
        {
            if (item == value)
                return index;
            index++;
        }
        return -1;
    }
}

此C#代码将为列表的每个实例添加一个方法。所以你可以写:

List<int> myList = new List<int>();
myList.Add(26);
myList.Add(42);
myList.Add(37);
myList.Add(3);
int index = myList.getIndex(42);

这在C ++中是否可行?如何正确地将此类方法添加到std::vector<T> 而不进行子类化呢?

很抱歉,如果这是重复的,我找不到任何回答我的问题而不使用继承。

1 个答案:

答案 0 :(得分:1)

如果您的目的仅仅是扩展std c ++容器类,那么您应该考虑算法而不是成员方法。

考虑这段代码。 没有错误检查以简洁

#include <vector>
#include <set>
#include <iostream>

// returns the second element
template< typename T>
int getSecond(T begin)
{
  begin++;
  return *begin;
}


int main()
{

  std::vector<int> intlist;
  intlist.push_back(1);
  intlist.push_back(2);
  intlist.push_back(3);

  std::set<int> intset;
  intset.insert(1);
  intset.insert(3);
  intset.insert(2);

  std::cout << "Second in vector " << getSecond(intlist.begin()) << std::endl;
  std::cout << "Second in set " << getSecond(intset.begin()) << std::endl;

}

现在可以假设将getSecond建模为std :: vector的一个成员,但是将其建模为一个独立函数,它采用迭代器非常强大,因为相同的函数可以用于设置deques等。

如果您有 N 容器和 M 算法作为成员函数,您将拥有 N * M 函数,但作为独立的算法函数,代码要少得多