是否有功能指针的爆炸

Is There a declval for Function Pointers?

本文关键字:指针 功能 是否      更新时间:2023-10-16

我有一个函数,我需要测试是否可以将给定类型的参数传递给它。例如:

template<typename T, auto F>
decltype(F(declval<T>{})) foo();

呼叫foo<int, bar>()做2件事:

  1. 设置foo的返回类型与bar
  2. 具有相同的返回类型
  3. 确保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_tstd::is_invocable代替。我建议模仿这些升级最无缝的升级。