#include <iostream>
// interface
template<class Imp>
class Interface{
public:
inline void print(void){
std::cout<<"value: ";
return asImp().print();
}
private:
typedef Imp Implementation;
inline Implementation& asImp(void){return static_cast<Implementation&>(*this);}
};
// add
class Add:public Interface<Add>{
public:
inline void print(void){std::cout<<value<<std::endl;++value;}
private:
int value;
};
// main
int main(void){
Interface<Add> foo;
foo.print();
foo.print();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gaW50ZXJmYWNlCgp0ZW1wbGF0ZTxjbGFzcyBJbXA+CmNsYXNzIEludGVyZmFjZXsKICBwdWJsaWM6CiAgICBpbmxpbmUgdm9pZCBwcmludCh2b2lkKXsKICAgICAgc3RkOjpjb3V0PDwidmFsdWU6ICI7CiAgICAgIHJldHVybiBhc0ltcCgpLnByaW50KCk7CiAgICB9CiAgcHJpdmF0ZToKICAgIHR5cGVkZWYgSW1wIEltcGxlbWVudGF0aW9uOwogICAgaW5saW5lIEltcGxlbWVudGF0aW9uJiBhc0ltcCh2b2lkKXtyZXR1cm4gc3RhdGljX2Nhc3Q8SW1wbGVtZW50YXRpb24mPigqdGhpcyk7fQp9OwoKLy8gYWRkCmNsYXNzIEFkZDpwdWJsaWMgSW50ZXJmYWNlPEFkZD57CiAgcHVibGljOgogICAgaW5saW5lIHZvaWQgcHJpbnQodm9pZCl7c3RkOjpjb3V0PDx2YWx1ZTw8c3RkOjplbmRsOysrdmFsdWU7fQogIHByaXZhdGU6CiAgICBpbnQgdmFsdWU7Cn07CgovLyBtYWluCmludCBtYWluKHZvaWQpewogIEludGVyZmFjZTxBZGQ+IGZvbzsKICBmb28ucHJpbnQoKTsKICBmb28ucHJpbnQoKTsKfQ==