ostream& operator<< (ostream& os,  const Foo &o), где Foo -- это ваш класс. Ну а если вам класс необходимо приводить к строковому представлению, то да, придётся вам реализовать метод руками, или же, что архитектурно более правильно, сделать отдельный класс и/или функцию для преобразования.       
  
   
  
  Из урны с 1 пронумерованным шариком вынимают по одному шарику. Подсчитать общее количество ситуаций, когда номер хотя бы одного вынутого шарика совпадает с порядковым номером действия "вынимания"Далее действуй по индукции.
template <class T>
T* create_class(T* object = nullptr)
{
   if (obj == nullptr) {
       obj = new T();
       if (obj == nullptr)
          throw Exception("Can't create " + std::string(name_of<T>()) + " object"); 
   }
   obj->init();
   return obj;
}
...
MyClass* mc = create_class<MyClass>();
delete mc; 
  
   
  
  макросы в С++
#include <iostream>
template<typename T>
auto sqr = [](T x)
{
  return x * x;
};
int main()
{
  std::cout << sqr<int>(3 + 0);
}//...
class __lambda_3_12
{
  public: inline int operator()(int x) const
  {
    return x * x;
  }
//...
};
//...