Первоначально предполагалось реализовать замыкания как:
template<typename T>
struct param_traits
{
// определяет как передавать и хранить аргумент
};
template<typename T>
struct param_traits<T const&>
{
//...
};
template<typename T>
struct param_traits<T&>
{
//...
};
template<typename A1, typename A2>
void spawn (void(*f)(A1, A2), typename param_traits<A1>::param_type a1, typename param_traits<A2>::param_type a2)
{
// запоминаем f, a1, a2 для последующего исполнения
}
// аналогичные функции spawn() для другого кол-ва аргументов
Важные преимущества:
— неправильные типы аргументов детектируются в месте вызова spawn
— автоматически определяется наиболее адекватный способ как хранить аргумент, т.е. не надо ref/cref как в boost
— отсутствует лишняя работа во время выполнения
— всего 1 шаблон spawn() для 2 аргументов
Теперь надо добавить различные хинты к аргументам, что-то типа такого:
X* x = new X (...);
spawn(foo, delete_after_execution(x));
или:
spawn(foo, pass_by_pointer(x)); // перекрываем способ передачи по-умолчанию
Не понимаю, как это сделать без потери указанных преимуществ.
Есть какие-нибудь идеи?