我想在模板类上调用一个方法,我需要一种方法来确保该方法将在我的模板类中。
我知道如何确保方法在类上可用的唯一方法是从纯虚基类派生类。这会产生大量的开销,如下面的代码所示。
显然,界面是无关的,与模板化类的显式特化无关,实际上是在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}}
答案 0 :(得分:0)
C ++不是Java。我不知道怎么说class或typename必须从另一个类派生。
真的是duck typing。只是使用方法,如果不存在,编译器将抛出错误。顺便说一下,当你写的时候
template <class Interface>
class Template {
public:
void salutations (void);
};
Interface
与此T
相同:它不要求使用的专门化将是class Interface
的子类。