是否有功能指针的爆炸
Is There a declval for Function Pointers?
我有一个函数,我需要测试是否可以将给定类型的参数传递给它。例如:
template<typename T, auto F>
decltype(F(declval<T>{})) foo();
呼叫foo<int, bar>()
做2件事:
- 设置
foo
的返回类型与bar
具有相同的返回类型 - 确保
bar
是接受参数的函数类型T
不幸的是,我无法访问auto
模板类型,但我仍然想完成这两个。我需要的是用于功能指针的decltype
,这将使我可以做这样的事情:
template <typename T, typename F>
decltype(declval<F>(declval<T>{})) foo();
这样,我仍然可以致电foo<int, bar>()
并获得相同的结果。当然,没有用于功能指针的declval
。但是有其他方法可以实现这一目标吗?
当然没有函数指针的剪辑。
你是什么意思?std::declval
与功能指针类型完美配合:
template<typename F, typename... Args>
using call_t = decltype(std::declval<F>()(std::declval<Args>()...));
在此示例中,F
可以是功能指针类型,lambda类型或任何可召唤类型。
以下是用法的示例:
template<typename T, typename F>
auto foo() -> call_t<F, T>;
使用检测成语(可在C 11中实现)的另一个示例:
template<typename F, typename... Args>
using is_callable = is_detected<call_t, F, Args...>;
static_assert(is_callable<void(*)(int), int>::value, "callable")
请注意,所有这些都可以用C 17中的std::invoke_result_t
和std::is_invocable
代替。我建议模仿这些升级最无缝的升级。
相关文章:
- 链表删除功能的单指针 // 是可能的
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- char* 除了作为C++中的指针之外,还有其他功能吗?
- 具有小对象优化功能的智能指针
- 如何定义和设置指向模板类方法的功能指针
- 将状态传递给功能指针
- 如何使用指针向量为班级制作复制功能
- 我对C 中共享指针列表进行排序的功能未完成类型
- 如何使用结构内的功能指针调用私有函数
- 如何将自己的智能指针传递到功能
- 模板功能以检查智能指针是否为空
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- 功能指针不起作用(C )
- 将C 方法作为功能指针传递
- 字符指针功能以复制C 中的字符串
- 指针?指针功能
- 反向指针功能问题
- 无效指针功能的输出
- 更好地解释C++指针功能
- 用memcpy c 读取并写入指针功能