LINUX.ORG.RU

История изменений

Исправление 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);


}