- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下委托(delegate)类:
template <typename RetVal, typename ...Args>
class KxCEventDelegate
{
union InstancePtr
{
InstancePtr(void) : as_void(nullptr) {}
void* as_void;
const void* as_const_void;
};
typedef RetVal(*InternalFunction)(InstancePtr, Args&& ...args);
typedef std::pair<InstancePtr, InternalFunction> Stub;
// Turns a free function into internal function stub
template <RetVal(*Function)(Args ...args)>
static KX_INLINE RetVal FunctionStub(InstancePtr, Args&& ...args)
{
// we don't need the instance pointer because we're dealing with free functions
return (Function)(std::forward<Args>(args)...);
}
// Turns a member function into internal function stub
template <class C, RetVal (C::*Function)(Args ...args)>
static KX_INLINE RetVal ClassMethodStub(InstancePtr instance, Args&& ...args)
{
// cast the instance pointer back into the original class instance
return (static_cast<C*>(instance.as_void)->*Function)(std::forward<Args>(args)...);
}
// Turns a member function into internal function stub
template <class C, RetVal(C::*Function)(Args ...args) const>
static KX_INLINE RetVal ClassMethodStubConst(InstancePtr instance, Args&& ...args)
{
// cast the instance pointer back into the original class instance
return (static_cast<const C*>(instance.as_const_void)->*Function)(std::forward<Args>(args)...);
}
public:
// Binds a free function
template <RetVal(*Function)(Args ...args)>
void Bind(void)
{
m_stub.first.as_void = nullptr;
m_stub.second = &FunctionStub<Function>;
}
// Binds a class method
template <class C, RetVal (C::*Function)(Args ...args)>
void Bind(C* instance)
{
m_stub.first.as_void = instance;
m_stub.second = &ClassMethodStub<C, Function>;
}
// Binds a class method
template <class C, RetVal(C::*Function)(Args ...args) const>
void BindConst(const C* instance)
{
m_stub.first.as_const_void = instance;
m_stub.second = &ClassMethodStubConst<C, Function>;
}
// Invokes the delegate
RetVal Invoke(Args ...args) const
{
KX_ASSERT(m_stub.second != nullptr, "Cannot invoke unbound delegate. Call Bind() first.", m_stub.second, nullptr);
return m_stub.second(m_stub.first, std::forward<Args>(args)...);
}
private:
Stub m_stub;
};
用法是这样的(免费功能):
int FreeFunctionInt(int i)
{
return i;
}
KxCEventDelegate<int, int> delegate;
delegate.Bind<&FreeFunctionInt>();
int ret = delegate.Invoke(10);
现在,我正在尝试实现一个类似于 C# 的通用 GetEventDelegate 函数。这是我带来的:
// Gets event delegate.
template <typename RetVal, typename ...Args>
KxCEventDelegate<RetVal, Args...> GetEventDelegate(RetVal(*Function)(Args ...args))
{
KxCEventDelegate<RetVal, Args...> delegate;
delegate.Bind<Function>();
return delegate;
}
这是我无法弄清楚哪里出了问题的部分。好像是delegate.Bind<Function>();
的问题.编译器给我以下错误:
1>------ Build started: Project: Tests, Configuration: Debug x64 ------
1>Main.cpp
1>c:\sdk\kx\kxengine\include\events\delegate.h(88): error C2672: 'kx::events::KxCEventDelegate<int,int>::Bind': no matching overloaded function found
1>c:\sdk\kx\tests\eventstests.h(76): note: see reference to function template instantiation 'kx::events::KxCEventDelegate<int,int> kx::events::GetEventDelegate<int,int>(RetVal (__cdecl *)(int))' being compiled
1> with
1> [
1> RetVal=int
1> ]
1>c:\sdk\kx\kxengine\include\events\delegate.h(88): error C2974: 'kx::events::KxCEventDelegate<int,int>::Bind': invalid template argument for 'C', type expected
1>c:\sdk\kx\kxengine\include\events\delegate.h(58): note: see declaration of 'kx::events::KxCEventDelegate<int,int>::Bind'
1>c:\sdk\kx\kxengine\include\events\delegate.h(88): error C2975: 'Function': invalid template argument for 'kx::events::KxCEventDelegate<int,int>::Bind', expected compile-time constant expression
1>c:\sdk\kx\kxengine\include\events\delegate.h(49): note: see declaration of 'Function'
1>Done building project "Tests.vcxproj" -- FAILED.
最佳答案
在此代码段中,您的通用 GetEventDelegate
函数:
template <typename RetVal, typename ...Args>
KxCEventDelegate<RetVal, Args...> GetEventDelegate(RetVal(*Function)(Args ...args)) {
KxCEventDelegate<RetVal, Args...> delegate;
delegate.Bind<Function>();
return delegate;
}
Function
不是常量表达式,如果您打算将它用作模板参数,它应该是常量表达式。
在 C++11/14 中,您可以使用另一个间接级别来解决它。像这样:
template <typename RetVal, typename ...Args>
struct Factory {
template<RetVal(*Function)(Args...)>
static KxCEventDelegate<RetVal, Args...> GetEventDelegate() {
KxCEventDelegate<RetVal, Args...> delegate;
delegate.Bind<Function>();
return delegate;
}
};
您可以按如下方式使用:
auto delegate = Factory<int, int>::GetEventDelegate<&FreeFunctionInt>();
无论如何,我建议改为向委托(delegate)类添加一个静态函数,并将其用作直接嵌入类型本身的工厂方法。
你最终会调用的东西:
auto delegate = KxCEventDelegate<int, int>::create<&FreeFunctionInt>();
至少从我的角度来看,读者更容易理解幕后发生的事情。
关于c++ - C++中的事件委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44084557/
我正在尝试将 WPF CodeBehid 事件(如 Event、Handler、EventSetter)转换为 MVVM 模式。我不允许使用 System.Windows.Controls,因为我使用
我可能误解了 Backbone 中的事件系统,但是当我尝试以下代码时什么也没有发生。当我向 Backbone.Events 扩展对象添加新属性时,它不应该触发某种更改、更新或重置事件吗?就像模型一样吗
我遇到了一个简单的问题,就是无法弄清楚为什么它不起作用。我有一个子组件“app-buttons”,其中我有一个输入字段,我想听,所以我可以根据输入值过滤列表。 如果我将输入放在我有列表的根组件中,一切
System.Timers.Timer 的 Elapsed 事件实际上与 System.Windows.Forms.Timer 的 Tick 事件相同吗? 在特定情况下使用其中一种比使用另一种有优势吗
嗨,这个 javascript 代码段是什么意思。(evt) 部分是如此令人困惑.. evt 不是 bool 值。这个怎么运作? function checkIt(evt) { evt
我正在使用jquery full calendar我试图在事件被删除时保存它。 $('calendar').fullCalendar ({
我有两个链接的鼠标事件: $('body > form').on("mousedown", function(e){ //Do stuff }).on("mouseup", function(
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
我尝试了 dragOver 事件处理程序,但它没有正常工作。 我正在研究钢琴,我希望能够弹奏音符,即使那个键上没有发生鼠标按下。 是否有事件处理程序? 下面是我正在制作的钢琴的图片。 最佳答案 您应该
当悬停在相邻文本上时,我需要使隐藏按钮可见。这是通过 onMouseEnter 和 onMouseLeave 事件完成的。但是当点击另外的文本时,我需要使按钮完全可见并停止 onMouseLeave
我有ul标签内 div标签。我申请了mouseup事件 div标记和 click事件 ul标签。 问题 每当我点击 ul标签,然后都是 mouseup和 click事件被触发。 我想要的是当我点击 u
我是 Javascript 和 jQuery 的新手,所以我有一个非常愚蠢的疑问,请耐心等待 $(document).click(function () { alert("!"); v
我有一个邮政编码解析器,我正在使用 keyup 事件处理程序来跟踪输入长度何时达到 5,然后查询服务器以解析邮政编码。但是我想防止脚本被不必要地调用,所以我想知道是否有一种方法可以跟踪 keydown
使用事件 API,我有以下代码来发布带有事件照片的事件 $facebook = new Facebook(array( "appId" => "XXX", "se
首次加载 Microsoft Word 时,既不会触发 NewDocument 事件也不会触发 DocumentOpen 事件。当 Word 实例已打开并打开新文档或现有文档时,这些事件会正常触发。
我发现了很多相关问题(这里和其他地方),但还没有具体找到这个问题。 我正在尝试监听箭头键 (37-40) 的按键事件,但是当以特定顺序使用箭头键时,后续箭头不会生成“按键”事件。 例子: http:/
给定的 HTML: 和 JavaScript 的: var $test = $('#test'); $test.on('keydown', function(event) { if (eve
我是 Node.js 的新手,希望使用流运行程序。对于其他程序,我必须同时启动一个服务器(mongodb、redis 等),但我不知道我是否应该用这个运行一个服务器。请让我知道我哪里出了问题以及如何纠
我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyb
我有以下代码: (function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({
我是一名优秀的程序员,十分优秀!