История изменений
Исправление BlackHawk, (текущая версия) :
Такое можно сделать, но получается очень страшная наркомания.
Вот это, наверное, допиливается до нужного состояния с помощью этой статьи.
#include <iostream>
#include <tuple>
#include <memory>
template<class R, class ... Args>
struct task_holder
{
virtual R operator() (Args&&... args) const = 0;
virtual ~task_holder()
{
}
};
template<class T, class R, class ... Args>
struct task_holder_impl : task_holder<R, Args...>
{
task_holder_impl(T const& func)
: func(func)
{ }
R operator() (Args&&... args) const override
{
return func(std::forward<Args>(args)...);
}
private:
T const& func;
};
template <class... Args>
struct task;
template<class R, class ... Args>
struct task<R(Args...)>
{
template<class T>
task(T const& func, Args... args)
: holder(new task_holder_impl<T, R, Args...>(func)), arguments(std::make_tuple(args...))
{ }
template<int N, class T>
void set_argument(T const& val)
{
std::get<N>(arguments) = val;
}
R operator() ()
{
// вот тут я остановился
}
private:
std::shared_ptr<task_holder<R, Args...>> holder;
std::tuple<Args...> arguments;
};
void f(int a, int b)
{
std::cout << a + b << std::endl;
}
int main()
{
task<void(int, int)> t(f, 1, 2);
task<void(int, int)> t1([](int a, int b) { std::cout << a + b; }, 1, 2);
}
Кстати такой хак, как передача шаблону параметров без угловых скобок, доступен только в конструкторах?
Это не хак, это вывод типов шаблонной функции на основе передаваемых параметров
Исправление BlackHawk, :
Такое можно сделать, но получается очень страшная наркомания.
Вот это, наверное, допиливается до нужного состояния с помощью этой статьи.
#include <iostream>
#include <tuple>
#include <memory>
template<class R, class ... Args>
struct task_holder
{
virtual R operator() (Args&&... args) const = 0;
virtual ~task_holder()
{
}
};
template<class T, class R, class ... Args>
struct task_holder_impl : task_holder<R, Args...>
{
task_holder_impl(T const& func)
: func(func)
{ }
R operator() (Args&&... args) const override
{
return func(std::forward<Args>(args)...);
}
private:
T const& func;
};
template <class... Args>
struct task;
template<class R, class ... Args>
struct task<R(Args...)>
{
template<class T>
task(T const& func, Args... args)
: holder(new task_holder_impl<T, R, Args...>(func)), arguments(std::make_tuple(args...))
{ }
template<int N, class T>
void set_argument(T const& val)
{
std::get<N>(arguments) = val;
}
R operator() ()
{
// вот тут я остановился
}
private:
std::shared_ptr<task_holder<R, Args...>> holder;
std::tuple<Args...> arguments;
};
void f(int a, int b)
{
std::cout << a + b << std::endl;
}
int main()
{
task<void(int, int)> t(f, 1, 2);
task<void(int, int)> t1([](int a, int b) { std::cout << a + b; }, 1, 2);
}
Кстати такой хак, как передача шаблону параметров без угловых скобок, доступен только в конструкторах?
Это не хак, это вывод типов шаблона на основе передаваемых параметров
Исходная версия BlackHawk, :
Такое можно сделать, но получается очень страшная наркомания.
Вот это, наверное, допиливается до нужного состояния с помощью этой статьи.
#include <iostream>
#include <tuple>
#include <memory>
template<class R, class ... Args>
struct task_holder
{
virtual R operator() (Args&&... args) const = 0;
virtual ~task_holder()
{
}
};
template<class T, class R, class ... Args>
struct task_holder_impl : task_holder<R, Args...>
{
task_holder_impl(T const& func)
: func(func)
{ }
R operator() (Args&&... args) const override
{
return func(std::forward<Args>(args)...);
}
private:
T const& func;
};
template <class... Args>
struct task;
template<class R, class ... Args>
struct task<R(Args...)>
{
template<class T>
task(T const& func, Args... args)
: holder(new task_holder_impl<T, R, Args...>(func)), arguments(std::make_tuple(args...))
{ }
template<int N, class T>
void set_argument(T const& val)
{
std::get<N>(arguments) = val;
}
R operator() ()
{
// вот тут я остановился
}
private:
std::shared_ptr<task_holder<R, Args...>> holder;
std::tuple<Args...> arguments;
};
void f(int a, int b)
{
std::cout << a + b << std::endl;
}
int main()
{
task<void(int, int)> t(f, 1, 2);
task<void(int, int)> t1([](int a, int b) { std::cout << a + b; }, 1, 2);
}