Социальные сети

It's hard to say "C++ is fun" with an open heart, unless you have read the original blog post on automatic memoization in C++0x: http://slackito.com/2011/03/17/automatic-memoization-in-cplusplus0x/

Indeed, the "little" template <typename ReturnType, typename... Args> std::function<ReturnType (Args...)> memoize(std::function<ReturnType (Args...)> func)  makes C++ so much fun! It "memoizes" functions and function objects unintrusively. Recursive functions cannot be effectively memoized that way in C++, unfortunately.

After looking at the problem from different angles, I finally came up with a solution around midnight. It can definitely be polished still, and might contain bits of very bad style (not the original code), but here it is (The memoize function by slackito.com + my C++Koan noodlings):

//original post: http://slackito.com/2011/03/17/automatic-memoization-in-cplusplus0x/
#include <iostream>
#include <functional>
#include <map>


//the original memoize
template <typename ReturnType, typename... Args>
std::function<ReturnType (Args...)> memoize(std::function<ReturnType (Args...)> func)
{

	std::map<std::tuple<Args...>, ReturnType> cache;
	return ([=](Args... args) mutable  {

		std::tuple<Args...> t(args...);
		if (cache.find(t) == cache.end()) {
			cache[t] = func(args...);
		}

		return cache[t];
	});
}

/// wrapped factorial
struct factorial_class {

	/// the original factorial with a sligh modification :
	/// recursive call factorial -> _factorial
	int factorial(int n) {
		if (n==0) return 1;

		else {
		std::cout<<"factorial("<<n<<"-1)*"<<n<<std::endl;

		return _factorial(n-1)*n;
		}
	}

	/// the trick function :)
	int _factorial(int n) {

		if (memo) return (*memo)(n);
		return factorial(n);
	}

	/// we're not a function, but a function object
	int operator()(int n) {
		return factorial(n);
	}

	/// the trick holder
	std::function<int(int)>* memo;

	factorial_class() { memo=0; }
};

int main()
{
	auto fact=factorial_class(); //virgin wrapper

	auto tmp = memoize( (std::function<int(int)>(fact) ) ); //memoize with the virgin wrapper copy

	fact.memo=&tmp; //spoilt wrapper
	tmp = memoize( (std::function<int(int)>(fact) ) ); //a new memoize with the spoilt wrapper copy

	std::cout<<tmp(3)<<std::endl; // 3 useful multiplications
	std::cout<<tmp(4)<<std::endl; // 1 useful multiplication

	std::cout<<tmp(6)<<std::endl; // 2 useful multiplications
}

http://pastebin.com/x3U2xz7C
compiles with g++ main.cpp -std=c++0x

It makes C++ even more fun! (Even if you hate it at the same time)

D.2011



Вам это будет интересно!

  • Безымянный 24884
  • Предстоящая пати в Милане…
  • Достала - послали
  • Дочитываю Татьяну Толстую…
  • Что я уже успела сделать)))


  • Последние новости


    Шаг 5. Выбираем фирменное наименование организации

    Если вы собираетесь регистрировать новое юридическое лицо, то перед вами неизбежно встают необходимость выбора его названия и ряд сопутствующих вопросов. Следует ли проверять выбранное наименование организации на уникальность перед подачей документов на регистрацию? Можно ли зарегистрировать компанию с таким же наименованием, как и у другой, уже существующей орган...
    Читать далее »

    Шаг 4. Выбор системы налогообложения

    Действующее налоговое законодательство позволяет налогоплательщику в некоторых случаях значительно уменьшить сумму уплачиваемых налогов путем грамотного выбора режима налогообложения. Выделяют общий режим налогообложения и специальные налоговые режимы, которые следует отличать от льготных режимов. При применении общего режима налогообложения налог...
    Читать далее »

    Аренда помещений

    Самым тесным образом с фактическим адресом организации связана Аренда Ею помещений, необходимых для налаживания выбранных видов деятельности. Для деятельности любой организации необходимо помещение. Однако недвижимость стоит сейчас очень дорого, и лишь немногие организации в состоянии приобрести помещение в собственность. В связи с этим значительная част...
    Читать далее »

    Шаг 3. Выбираем место нахождения организации

    МЕСТО НАХОЖДЕНИЯ ОРГАНИЗАЦИИ, ЕЕ ЮРИДИЧЕСКИЙ, ФАКТИЧЕСКИЙ И ПОЧТОВЫЙ АДРЕСА В ГК РФ приведено понятие «место нахождения юридического лица» – так называемый юридический адрес, официально зарегистрированный в ЕГРЮЛ. Однако юридическое лицо может располагаться и по другому адресу – фактическому. В гражданском законодательстве не содержит...
    Читать далее »

    Карточка

    С образцами подписей и оттиска печати ...
    Читать далее »

    Форма

    Документа, подтверждающего наличие лицензии Приложение 26 СЕРТИФИКАТ СООТВЕТСТВИЯ ...
    Читать далее »

    Уведомление

    О регистрации юридического лица в территориальном органе Пенсионного фонда Российской Федерации по месту нахождения На территории Российской Федерации Приложение 22 Свидетельство О регистрации страхователя в территориальном фонде Обязательного медицинского страхования При обязательном мед...
    Читать далее »