#include <iostream>
#include <type_traits>
using namespace std;

class Figure {
	public:
		virtual void print() const = 0;
};

class Circle : public Figure {
	public:
		void print() const override {
			cout << "Circle" << endl;
		}
};

class Triangle : public Figure {
	public:
		void print() const override {
			cout << "Triangle" << endl;
		}
};

template <typename T>
void log(const T &figure) {
	static_assert(std::is_base_of<Figure, T>::value,
		"It has to be a Figure");
    
    figure.print();
}

int main() {
	Circle circle;
	Triangle triangle;
	
	log(circle);
	log(triangle);
	
	return 0;
}