问题描述
我编写了一些代码,该代码能够根据调用站点分派一个函数,该调用站点提供与给定函数相关联的字符串(通过tuple
函数指针和并行数组)。派发函数不直接接受字符串,而是接受Callable
类型,其中const char*
可转换为Callable
。
Callable
的构造函数为constexpr
,并通过基本的递归搜索从指定的tuple
中查找一个函数。我已经验证了构造函数能够正常工作并创建constexpr
Callable
(包括示例)。由于分派函数接收要传递给Callable
的{{1}}的参数,因此我知道在创建operator()
的{{1}}时期望的函数签名
我正在尝试在编译时执行两项检查,而这两项检查可以在编译时完成。首先,我检查提供的字符串是否存在于预定义的字符串数组中。其次,我检查与该字符串关联的函数的签名是否与来自函数指针Callable
的预期签名匹配。我在编译时通过operator()
内的tuple
方法(用于查找函数)创建“友好”错误消息。
我已验证通过创建一个throw()
可调用对象,可以在编译时获得预期的错误消息。这有效。如果我直接使用constexpr
,让调用站点将字符串转换为constexpr
,则无法获得编译时消息。我知道当我使用运行时参数时,不会在Dispatcher
上下文中调用我的调度函数-我故意没有使该函数成为Callable
;关键是使用运行时值调用它。但是我认为隐式转换“发生在调用站点” ,而不是在被调用函数中。
因此,我认为在像constexpr
这样的调用中(它调用参数为1的第一个函数)看起来像:“一个”在转换为constexpr
呼叫站点,则以dispatcher("one",1)
的身份进行呼叫。这意味着至少可以使用Callable
构造函数 。根据我的经验,只要您不忽略调用dispatcher(Callable("one"),1)
的结果,就会以constexpr
进行呼叫,否则为运行。参见Constexpr functions not called at compile-time if result is ignored。不会发生这种情况-在运行时调用转换函数构造函数 !
有人知道我可以更改代码以使转换构造函数在编译时被调用的方式吗?我在this post中找到了一种完全不同的解决方案来解决这一一般问题,但坦率地说,如果可以的话,我更喜欢下面代码的语法。
在本文的正文中,我不会包含上面的代码,而是包含一个更规范的示例,该示例展示了行为,并且还展示了我在我上面引用的文章中看到的行为(多合一)
以下内容的实时演示:https://onlinegdb.com/r1s1OE77v
有关“真实”问题的实时演示,如果有兴趣的话:https://onlinegdb.com/rJCQ2bGXw
首先是“测试装置”:
constexpr
现在的测试代码:
constexpr
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)