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

Can we extend existing classes with custom functions? (No inheritance)

本文关键字:继承 自定义函数 扩展 我们      更新时间:2023-10-16

我正在寻找一种用自定义成员方法扩展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>中,而不将其子类化

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

如果您的意图只是扩展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的一个成员,但将其建模为一个使用迭代器的独立函数是非常强大的,因为相同的函数可以用于set-deques等。

如果你有N容器和M算法作为成员函数,你会有N*M