gpt4 book ai didi

C++:具有 STL 类型和自定义类型的优雅 "polymorphism"?

转载 作者:行者123 更新时间:2023-11-28 01:43:58 24 4
gpt4 key购买 nike

假设我有一个名为 my_vectorstd::vector 自定义实现,它们具有相同的接口(interface)。

有许多函数将 std::vector(或其指针/引用)作为输入。我想对这些函数进行尽可能少的修改,同时允许它们接受 std::vectormy_vector

用函数模板替换这些函数是一种方法,但似乎有很多变化(因此难以回滚),除非我使用 std::is_same,否则它们无法进行类型检查 使它们更加复杂。函数重载是另一种选择,但它需要复制代码,并且也很难回滚更改。

问题:我可以为std::vectormy_vector设计一个包装类型Vector,然后让这些函数接受 Vector (或其指针/引用)代替?但多态性的问题是 std::vector 无法继承自定义类。

理想情况下,代码应该与此类似(不需要相同):

函数定义:

// void foo(std::vector<char> vec) {...} // old
void foo(Vector<char> vec) {...} // new

使用函数:

std::vector<char> stdvec(5,'a');
my_vector<char> myvec(5,'a');
...

foo(stdvec);
foo(myvec);

谢谢!

PS1:接受迭代器而不是容器对象是一个很好的建议。但是,有些操作无法通过迭代器实现(例如,push_back()resize()reserve()):

void extendVectorAndAddGarbage(std::vector<char> &vec) {
size_t so=vec.size();
vec.reserve(sz*100);
for (size_t i=sz; sz<sz*100;++sz) {...}
}

PS2:容器可能不是std::vector - 我问的是在 STL 类型和具有相同接口(interface)的自定义类型上使用“多态性”。

PS3:如果您认为无法实现,请毫不犹豫地写下答案。

最佳答案

Question: can I design a wrapper type Vector for std::vector and my_vector, and let those functions accept Vector (or its pointer/reference) instead? But the problem with polymorphism is std::vector can't inherit a custom class.

我真的是 OO 的粉丝,拥有继承和多态性以及所有这些很酷的东西,但更重要的是,我更喜欢在不需要时不做 OO。是的,你当然可以编写一个包装器,让你可以多态地使用任何类型,你可以使用继承(如果你愿意,甚至可以使用多个),但你为什么要这么做?您真的要编写所有样板文件吗?

如果您希望对现有代码进行最少的更改,例如

// void foo(std::vector<char> vec) {...} // old
void foo(Vector<char> vec) {...} // new

然后将其设为模板:

template <typename T> void foo(T vec) {...}

对于你的例子,那将是

template <typename T> 
void foo(T &vec) {
size_t so=vec.size();
vec.reserve(sz*100);
for (size_t i=sz; sz<sz*100;++sz) {...}
}

如果你真的想阻止自己用不同于 std::vectormy_vector 的东西实例化模板,那么你可以这样做:

namespace {
template <typename T>
void foo_impl(T& t) {
size_t so=vec.size();
vec.reserve(sz*100);
for (size_t i=sz; sz<sz*100;++sz) {...}
}
}

void foo(std::vector& t) { foo_impl(t);}
void foo(my_vector& t) { foo_impl(t);}

关于C++:具有 STL 类型和自定义类型的优雅 "polymorphism"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45987890/

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