问题描述
我创建了一个主要模板和两个特化:一个用于 void 类型,另一个是用于不同参数类型的参数包。
后台是一个“连接”引擎,连接返回void的成员函数,所以我不需要返回类型,只需要参数类型。 这些类就像包装器一样,提供了一个语法友好的静态函数来创建具体的链接。
所以我的代码是这样的:
/**
* CalleeCreator class,primary template
*/
template <typename T> class CalleeCreator;
template <typename... TParams>
class CalleeCreator<TParams...> final
{
public:
template <typename TObject,void(TObject::*Function)(TParams...)>
constexpr static void create(const char*name,TObject& instance)
{
new Callee< void (TObject::*)(TParams...),Function>( name,instance);
}
};
template <>
class CalleeCreator<void> final
{
template <typename TObject,void(TObject::*Function)(void)>
constexpr static void create(const char* name,TObject& instance)
{
new Callee< void (TObject::*)(void),instance);
}
};
只要我这样调用:
CalleeCreator<uint8_t,uint16_t>::create<Object,&Object::method> ("test",*this);
打电话时
CalleeCreator<void>::create<Object,*this);
按预期工作
我不明白的是,我创建了另一个具有返回类型和相同主模板的版本:
template <typename TReturn,typename... TParams>
class CalleeCreator<TReturn(TParams...)> final
{
public:
template <typename TObject,TReturn(TObject::*Function)(TParams...)>
constexpr static void create(ConstCharPtr name,TObject& instance)
{
new Callee< TReturn (TObject::*)(TParams...),instance);
}
};
template <typename TReturn>
class CalleeCreator<TReturn(void)> final
{
public:
template <typename TObject,TReturn(TObject::*Function)(void)>
constexpr static void create(ConstCharPtr name,TObject& instance)
{
new Callee< TReturn (TObject::*)(void),instance);
}
};
如果我打电话给他们,一切都会好起来的:
CalleeCreator<void(uint8_t,uint16_t)>::create<Object,*this);
我不明白我在这里做错了什么。
另外,Callee 类可以查看模板和构造函数。
/** Class Callee,primary
*/
template <typename T,T> class Callee;
template <typename TObject,typename... TParams,void (TObject::*Function)(TParams...)>
class Callee<void (TObject::*)(TParams...),Function> final
{
public:
Callee(const char* name,TObject& instance){}
};
当然还有一个 Callee 类,它也有其他解决方案的返回类型。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)