c++ - 具有非类型模板参数的多态性

标签 c++ events templates inheritance polymorphism

我希望这不会过于复杂。我尝试在互联网上搜索了一段时间,虽然我发现了很多关于模板、继承等的问答,但我发现的资源都没有处理这个特定问题:

我想为 std::vector<T> 创建一个包装器这只会创建 std::vector<MyClass> 类型的 vector 或其任何继承类。

这基本上看起来像:

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 参数类型传递给所有已注册的处理程序,并且在编译期间错误会失败。

如有任何想法或意见,我们将不胜感激。

迈克尔

最佳答案

如果您使用的是 C++11,您可以访问 std::is_base_of<> 和 static_assert()

当传递给 myVector 的类型无法转换为 Base 时,您可以让编译器给您一个错误。

#include <type_traits>

class Base
{};

class Derived : public Base
{};

template <class T>
class Foo
{
public:
    Foo()
    {
        static_assert (std::is_base_of<Base,T>::value, "Error: Type T not derived from Base");
    }
};

class Lol
{
};


Foo<Derived> foo1;
Foo<Lol> foo2; //Static assert fails

(请在此处查看编译器输出 http://ideone.com/NAXSA)

如果您没有 C++11 支持,那么您需要做更多的工作,但仍然可以完成。请参阅此处关于 https://stackoverflow.com/a/4532302/564944 的信息

关于c++ - 具有非类型模板参数的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11477722/

相关文章:

c++ - 使用存储在 vector 中的函数指针

c++ - 继承的部分特化。我可以避免继承吗?

c++ - 是否可以在没有显式特化的情况下调用可变参数模板函数?

c++ - 为什么 isnan、isinf 和 isfinite 返回 int 而不是 bool?

c++ - 按值将子类对象传递给采用父类(super class)对象的函数是否是明确定义的行为?

android - 在 View 上叠加颜色

c# - 当我想双击时如何避免单击?

javascript - jQuery 事件委托(delegate)不适用于点击 div

c++ - 没有对模板函数的匹配函数调用

c++ - 我们可以像 C 中的结构一样使用 C++ 中的类吗?