Skip to content

Virtual method template

前面已经知道virtual method template是不可行的,那是否有方法来实现类似的效果呢?

意图

从本质上来说,使用 virtual method template的意图是: polymorphism。这种polymorphism,可以是static的也可以是dynamic的。

draft: 下面是我之前的说法:

有的时候,希望参数化基类的virtual method的类型,然后子类来进行override,但是非常明显的是,c++是不允许Virtual template method,那如何实现呢?

解决方案

下面是我目前想到的解决方案:

1、使用template class,将这些模板参数放到class级别

"template class with non-template virtual method"是可行的,但是这种方案的不能够解决所有的问题,比如类似如下的形式:

template<typename T>
virtual void Test(T t)
{}

由于它的入参是参数的化的,显然使用本节描述的这种方案是不行的

2、使用type erasure

想要实现polymorphism,但是受限于template的type无法进行统一的描述,那如果将type去除 + polymorphism就是能够满足需求了,显然这就是type erasure能够达到的。

1、使用 void pointer,这种方案是使用C generic programming的思路,它其实对应的是type erasure,但是感觉它不是C++的做法。

2、按照artima On the Tension Between Object-Oriented and Generic Programming in C++ 中的说法,它是:

Type Erasure as the Glue between OO and Generic Programming

3、在 Type-erasure-OOP-GP 章节中,对它进行了介绍

3、使用policy-based design

这种做法是非常符合C++ template meta programming的:

1、它能够实现polymorphism

2、它是type safe的

3、高效: static polymorphism

在下面章节中,对它进行了介绍:

1、rivermatrix-C++templates-with-virtual-functions

2、Policy-based-design

4、在 CppCoreGuidelines T.83: Do not declare a member function template virtual 中给出了Alternative

Double dispatch, visitors, calculate which function to call

推荐的解决方案

推荐"3、使用policy-based design"。

提及virtual method template的文章

1、fluentcpp Polymorphic clones in modern C++

experts-exchange virtual template function workaround

TODO

https://stackoverflow.com/questions/7968023/c-virtual-template-method

https://stackoverflow.com/questions/2354210/can-a-class-member-function-template-be-virtual?rq=1