#include <iostream>
#include <vector>
using namespace std;
struct TaskInterface {
virtual void Do() = 0;
virtual ~TaskInterface() {}
};
template<class Impl>
class TaskBase
: public TaskInterface {
virtual void Do() {
DoDerivedImpl();
}
protected:
void DoDerivedImpl() {
static_cast<Impl*>(this)->DoImpl();
}
void DoImpl() {
// Issue a static_assert error here, that there's no appropriate overridden
// implementation of DoImpl() available:
static_assert(static_cast<Impl*>(this)->DoImpl != TaskBase<Impl>::DoImpl, "TaskBase requires an appropriate implementation of DoImpl()");
}
};
class TaskType1 : public TaskBase<TaskType1> {
public:
void DoImpl() {
cout << "TaskType1::DoImpl()" << endl;
}
};
class TaskType2 : public TaskBase<TaskType2> {
public:
void DoImpl() {
cout << "TaskType2::DoImpl()" << endl;
}
};
int main() {
std::vector<TaskInterface*> tasks;
TaskType1 t1;
TaskType2 t2;
tasks.push_back(&t1);
tasks.push_back(&t2);
for(std::vector<TaskInterface*>::iterator it = tasks.begin();
it != tasks.end();
++it) {
(*it)->Do();
}
}
CSNpbmNsdWRlIDxpb3N0cmVhbT4KCSNpbmNsdWRlIDx2ZWN0b3I+Cgl1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIHN0cnVjdCBUYXNrSW50ZXJmYWNlIHsKICAgICAgICB2aXJ0dWFsIHZvaWQgRG8oKSA9IDA7CiAgICAgICAgdmlydHVhbCB+VGFza0ludGVyZmFjZSgpIHt9CiAgICB9OwoKICAgIHRlbXBsYXRlPGNsYXNzIEltcGw+CiAgICBjbGFzcyBUYXNrQmFzZSAKICAgIDogcHVibGljIFRhc2tJbnRlcmZhY2UgewogICAgICAgIHZpcnR1YWwgdm9pZCBEbygpIHsKICAgICAgICAgICAgRG9EZXJpdmVkSW1wbCgpOwogICAgICAgIH0KICAgIHByb3RlY3RlZDoKICAgICAgICB2b2lkIERvRGVyaXZlZEltcGwoKSB7CiAgICAgICAgICAgIHN0YXRpY19jYXN0PEltcGwqPih0aGlzKS0+RG9JbXBsKCk7CiAgICAgICAgfQoKICAgICAgICB2b2lkIERvSW1wbCgpIHsKICAgICAgICAgICAgIC8vIElzc3VlIGEgc3RhdGljX2Fzc2VydCBlcnJvciBoZXJlLCB0aGF0IHRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgb3ZlcnJpZGRlbgogICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgRG9JbXBsKCkgYXZhaWxhYmxlOgogICAgICAgICAgICAgc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxJbXBsKj4odGhpcyktPkRvSW1wbCAhPSBUYXNrQmFzZTxJbXBsPjo6RG9JbXBsLCAiVGFza0Jhc2UgcmVxdWlyZXMgYW4gYXBwcm9wcmlhdGUgaW1wbGVtZW50YXRpb24gb2YgRG9JbXBsKCkiKTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICBjbGFzcyBUYXNrVHlwZTEgOiBwdWJsaWMgVGFza0Jhc2U8VGFza1R5cGUxPiB7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBEb0ltcGwoKSB7CiAgICAgICAgICAgIGNvdXQgPDwgIlRhc2tUeXBlMTo6RG9JbXBsKCkiIDw8IGVuZGw7CiAgICAgICAgfQogICAgfTsKCiAgICBjbGFzcyBUYXNrVHlwZTIgOiBwdWJsaWMgVGFza0Jhc2U8VGFza1R5cGUyPiB7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBEb0ltcGwoKSB7CiAgICAgICAgICAgIGNvdXQgPDwgIlRhc2tUeXBlMjo6RG9JbXBsKCkiIDw8IGVuZGw7CiAgICAgICAgfQogICAgfTsKCglpbnQgbWFpbigpIHsKCSAgICBzdGQ6OnZlY3RvcjxUYXNrSW50ZXJmYWNlKj4gdGFza3M7CgkgICAgVGFza1R5cGUxIHQxOwoJICAgIFRhc2tUeXBlMiB0MjsKCSAgICB0YXNrcy5wdXNoX2JhY2soJnQxKTsKCSAgICB0YXNrcy5wdXNoX2JhY2soJnQyKTsKCSAgICAKCSAgICBmb3Ioc3RkOjp2ZWN0b3I8VGFza0ludGVyZmFjZSo+OjppdGVyYXRvciBpdCA9IHRhc2tzLmJlZ2luKCk7CgkgICAgICAgIGl0ICE9IHRhc2tzLmVuZCgpOwoJICAgICAgICArK2l0KSB7CgkgICAgICAgIAkoKml0KS0+RG8oKTsKICAgICAgICB9Cgl9