Создание статической функции-члена шаблона? - PullRequest
0 голосов
/ 04 июня 2018

У меня проблема, учитывая этот фрагмент кода:

class Thread{
    private:
    template<class t_Funtion, class ... t_Args>
    struct ThreadExiter
    {
        using CallbackType = decltype(std::bind(std::declval<t_Funtion>(), std::declval<t_Args>()...));

        static CallbackType m_Callback;

        template<class ... t_ConstructorArgs>
        ThreadExiter(t_Funtion p_Function, t_ConstructorArgs ... p_Args) :
            m_Callback(std::forward<t_Funtion>(p_Function), std::forward<t_ConstructorArgs&&>(p_Args) ...)
        {
            // Nothing to do
        }
        ~ThreadExiter()
        {
            m_Callback();
        }
    };

Как мне создать экземпляр статического члена static CallbackType m_Callback;?

Я пытался:

template<class t_Funtion, class ... t_Args> 
typename Thread::ThreadExiter<t_Funtion, t_Args...>::CallbackType Thread::ThreadExiter<t_Funtion, t_Args...>::m_Callback

Но я получил:

error: no matching function for call to 'std::_Bind<int (*(Thread*)) Thread*)>::_Bind()'  typename Thread::ThreadExiter<t_Funtion, t_Args...>::CallbackType Thread::ThreadExiter<t_Funtion, t_Args...>::m_Callback;
                                                               ^

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Спасибо!В конце концов я решил так (потому что у меня не было конструктора копирования и присваивания):

     static CallbackType* m_Callback;
        template<class ... t_ConstructorArgs>
        ThreadExiter(t_Funtion p_Function, t_ConstructorArgs ... p_Args)
        {
            static CallbackType l_Callback(std::forward<t_Funtion>(p_Function), std::forward<t_ConstructorArgs&&>(p_Args) ...);
            m_Callback = &l_Callback;
        }

        ~ThreadExiter()
        {
            m_Callback->operator()();
        }

Реализовано так:

Template<class t_Funtion, class ... t_Args>
using CallbackType = decltype(std::bind(std::declval<t_Funtion>(), 
std::declval<t_Args>()...));

template<class t_Funtion, class ... t_Args>
CallbackType<t_Funtion, t_Args...>* Thread::ThreadExiter<t_Funtion, t_Args...>::m_Callback;
0 голосов
/ 04 июня 2018

Вы ошибаетесь при попытке создать статический член в конструкторе ThreadExiter:

ThreadExiter(/*...*/) : m_Callback(/*...*/) {}

Здесь вы идете:

class Thread
{
private:
    template<class t_Funtion, class ... t_Args>
    struct ThreadExiter
    {
        using CallbackType = decltype(std::bind(std::declval<t_Funtion>(), std::declval<t_Args>()...));

        static CallbackType m_Callback;

        template<class ... t_ConstructorArgs>
        ThreadExiter(t_Funtion p_Function, t_ConstructorArgs ... p_Args)
        {
            m_Callback = CallbackType{std::forward<t_Funtion>(p_Function), std::forward<t_ConstructorArgs&&>(p_Args) ...};
        }
        ~ThreadExiter()
        {
            m_Callback();
        }
    };
};

template<class t_Funtion, class ... t_Args> 
typename Thread::ThreadExiter<t_Funtion, t_Args...>::CallbackType Thread::ThreadExiter<t_Funtion, t_Args...>::m_Callback;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...