我希望这不会过于复杂。我已经尝试在互联网上搜索了一段时间,虽然我发现了很多关于模板、继承等的 Q/As,但我发现的资源都没有处理这个特定问题:
我想创建一个包装器,std::vector<T>
它只会创建类型的向量std::vector<MyClass>
或其任何继承的类。
这基本上看起来像:
Class Base;
Class Derived : Base;
template <Base T> class myVector{
public:
void add(T);
protected:
std::vector<T> list;
}
目标是能够拥有一个具有以下行为的库:
Base A;
Derived D;
int i;
myVector<A> AVector; // This should work
myVector<D> DVector; // This should work
myVector<i> iVector; // This should NOT work
AVector.add(A); // This should work
AVector.add(D); // This should work (through polymorphism)
DVector.add(D); // This should work
DVector.add(A); // This should not work
任何人都可以对上述问题/示例发表评论吗?我的最终目标是在 C++ 中推出我自己的基本事件处理。在这种情况下,A 将类似于 c# EventArgs。B 将允许特定的 EventArgs 类型。我毫不怀疑 Boost 等人具有类似的功能,但我想暂时避开这条路线。
在实践中,代码将类似于(基于我在互联网上某处找到的教程):
template<EventArgs arg> class Event{
typedef void (*fptr)(arg);
std::vector<fptr> listeners;
}
void notifylisteners(arg){
for (typename std::vector<fptr>::iterator iter = listeners.begin(); iter != listeners.end; ++iter)
(**iter)(arg); // there should be a check for a valid reference, in case one of the function pointers becomes invalid
宣言
Event<myEventHandlerType> myEvent;
将有效地发挥与 C# 代码相同的功能:
public event myEventHandlerType myEvent;
由于对 std::vector 的依赖,此实现需要模板。在这里使用非类型参数模板(如果可以的话)的好处是它会强制使用特定的 eventArg 参数类型来传递给所有注册的处理程序,并且在编译期间错误会失败。
任何想法或意见将不胜感激。
迈克尔