gpt4 book ai didi

c++ - 静态模板成员函数的实例化?

转载 作者:行者123 更新时间:2023-11-28 04:38:53 24 4
gpt4 key购买 nike

给定这段代码,我有一个问题:

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;
^

最佳答案

尝试在 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;

关于c++ - 静态模板成员函数的实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50683963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com