Цель моей программы - создать список данных, которые я могу посетить с набором статических посетителей, используя статический полиморфизм в моей иерархии классов.
Я создал иерархию классов, используя статический полиморфизм через CRTP:
class VirtualBaseData {
public:
//someVirtualFunction
}
template<typename Derived>
class BaseData<Derived> {
public:
template<typename Visitor>
void accept(Visitor &v){
static_cast<Derived*>(this)->accept(v);
}
}
class DerivedBaseData1: BaseData<DerivedBaseData> {
public:
template<typename Visitor>
void accept(Visitor &v){
//Specific implementation
}
}
class DerivedBaseData2: BaseData<DerivedBaseData> {
public:
template<typename Visitor>
void accept(Visitor &v){
//Specific implementation
}
}
Я хочу сохранить DerivedBaseData в контейнере для последующего повторения и посещения.
int main(){
std::vector<VirtualBaseData*> dataSet;
dataSet.push_back(new DerivedBaseData1);
dataSet.push_back(new DerivedBaseData2);
for(auto it = fifth.begin(); it != fifth.end(); ++it){
it->accept(); //Error: VirtualBaseData does not have a member function accept
}
}
Я ищу способ связать моих статических посетителей с моей статической иерархией полиморфизма. Мне нужен класс VirtualBaseData в моем статическом полиморфизме, который не является классом-шаблоном, чтобы использовать классы в контейнерах. Однако, поскольку класс VirtualBaseData не может быть классом-шаблоном, я не могу создать соответствующий static_cast для производного класса, как это делается в CRTPattern.
Мой вопрос: есть ли у кого-нибудь хорошая стратегия, которая сохранила бы мою настройку статического полиморфизма, а также шаблон статического посетителя?
Для справки: я реализовал своих статических посетителей, как описано на стр. 21-23 в http://hillside.net/plop/2006/Papers/Library/portableProgrammingPL.pdf