C ++:如何将类模板限制为从纯虚拟基础派生的类

时间:2015-02-01 09:11:01

标签: c++ templates inheritance

我想在模板类上调用一个方法,我需要一种方法来确保该方法将在我的模板类中。

我知道如何确保方法在类上可用的唯一方法是从纯虚基类派生类。这会产生大量的开销,如下面的代码所示。

显然,界面是无关的,与模板化类的显式特化无关,实际上是在main.cpp中驱动代码。我只是老式并坚持“接口”,还是有一种现代的面向对象的方法来确保模板类完整?

修改 为了深入了解下面的代码...

有一个名为“Interface”的接口,它有一个虚拟析构函数和一个名为sayHi()的纯虚方法。 A继承自Interface并实施sayHi()。然后将A作为模板传递到Template,然后sayHi()salutations()方法中调用#include "a.h" #include "template.h" int main (int argc, char * argv[]) { Template<A> a; a.salutations(); return 0; } 。为了进一步混淆事物,静态方法是我的问题的最佳解决方案。但是,为了使用基类作为接口来为我的模板类提供继承,我没有静态方法,所以你看到两个非静态方法来满足虚方法,一个静态方法满足我的需要。

正如我所看到的那样,除了以面向对象的方式组织界面之外不需要界面,并且它会导致相当大的痛苦。是否有另一种方法来获得界面提供的秩序感,或者这种思维方式是否过时?


的main.cpp

#ifndef INTERFACE_H
#define INTERFACE_H

struct Interface {
    virtual
    ~Interface (
        void
    ) {}

    virtual
    void
    sayHi (
        void
    ) const = 0;
};

#endif

interface.h

#ifndef A_H
#define A_H

#include "interface.h"

class A : public Interface {
  public:
    A (
        void
    );

    ~A (
        void
    );

    void
    sayHi (
        void
    ) const;

    static
    void
    sayHi (
        bool = false
    );
};

#endif

A.H

#include "a.h"

#include <iostream>

A::A (
    void
) {}

A::~A (
    void
) {}

void
A::sayHi (
    void
) const {
    return A::sayHi(true);
}

void
A::sayHi (
    bool
) {
    std::cout << "Hi from A!" << std::endl;
}

a.cpp

#ifndef TEMPLATE_H
#define TEMPLATE_H

template <class Interface>
class Template {
  public:
    void salutations (void);
};

#endif

template.h

#include "template.h"

#include "a.h"

template<>
void
Template<A>::salutations (
    void
) {
    A::sayHi();
    return;
}

template.cpp

{{1}}

1 个答案:

答案 0 :(得分:0)

C ++不是Java。我不知道怎么说class或typename必须从另一个类派生。

真的是duck typing。只是使用方法,如果不存在,编译器将抛出错误。顺便说一下,当你写的时候

template <class Interface>
class Template {
  public:
    void salutations (void);
};

Interface与此T相同:它不要求使用的专门化将是class Interface的子类。