gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:45:54 24 4
gpt4 key购买 nike

我正在寻找一种使用自定义成员方法扩展 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> 没有子类化吗?

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

最佳答案

如果您的目的只是扩展标准 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 的成员,但是将其建模为采用迭代器的独立函数非常强大,因为相同的函数可以与 sets deques 等一起使用。

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

关于c++ - 我们可以使用自定义函数扩展现有类吗? (无继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29182960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com