正在尝试将多态性添加到模板函数中
Trying to add polymorphism to template function
所以,是的,你不能有一个模板虚拟类成员函数。这是有道理的,不要试图弄清楚那部分。。。我拼命避免多重/虚拟继承。
我有一个模板类a,一个从a继承的抽象模板类B,以及一个从B继承的C。
template <typename T>
class A
{
protected:
T val;
public:
A(T a) {val = a;}
T val() {return val();}
template <typename J>
A<J> cast_as() { return A<J>((J)val); }
};
template <typename T>
class B : public A<T>
{
protected:
int b;
public:
B(T a) : A(a){b=10*a;}
virtual foo() = 0;
//and I'd like, but this can't exist
//template <typename J>
//B<J>* BCastAs();
};
template <typename T>
class C : public B<T>
{
protected:
int c;
public:
C(T c) : B(c) { c=c+1;}
virtual foo() override { cout << (a+b+c);}
};
int main() { C<int> c(10); B<double>* b = c.BCastAs<double>();}
我想不出任何办法。。。感觉这应该是可能的,因为B*实际上不需要知道它是一个C(很像克隆调用的返回),但我不知道在没有虚拟模板成员函数的情况下让C正确移动的方法,这是不可能的。
乍一看,您发布的示例代码似乎有一个严重的设计缺陷。
通常,类模板中没有必要有虚拟函数,因为您可以使用CRT模式来避免它们。
您提出了需要继承类的意图(这就是您制作模板"抽象"的方式),这些类实现了定义的接口。接口可以被定义为或(优选地)不被定义为纯虚拟方法(静态接口检查也可以,并且在缺少方法实现的情况下会导致不那么神秘的编译器错误消息)。
您可以在我的STTCL模板库中看到这样的模板框架的示例以及如何使用此技术。
简而言之:使用静态多态性。
更新:
是的,我还在STTCL中使用纯虚拟方法,但方式完全不同(就像耦合完整继承层次结构的基本入口点一样)。
相关文章:
- 如何仅为一个函数添加延迟
- 如何将带有参数的愚蠢函数添加到愚蠢的执行器中?
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- C++泛型包装类,它为某些函数添加了额外的处理
- 将自己的函数添加到 ifstream
- 如何调用运算符函数添加两个对象?
- 如何在保持多态性的同时,将成员函数添加到需要它的继承类中,而不会影响其他同级类?
- Clang在发出LLVM IR时向所有函数添加noinline属性
- 将构造函数添加到boost.python子类导致参数不匹配错误
- 我需要为返回容器副本的函数添加锁吗
- 是否可以执行范围添加更新,将线性函数添加到最大分段树中
- 将第一个虚拟函数添加到类中
- 如何告诉编译器向编译的每个函数添加一个函数调用
- Doxygen没有为函数添加文档
- 在C++中为纯虚拟/抽象函数添加主体
- 如何在不重写 lib 类的情况下将函数添加到它
- ATL COM将函数添加到excel中
- 向成员函数添加常量限定符
- 向简单日志记录函数添加线程安全性
- 将函数添加到单独文件的正确方式