c++ - 我可以从签名中获取函数的返回类型吗?
问题描述
所以我有很多类似于这些的功能:
template <typename T>
bool Zero(const T, const T, const T);
template <typename T>
T One(const T, const T, const T, bool);
template <typename T>
T Three(const T, const T, const T, const T, const T, const T);
对于这些函数中的每一个,我都有一个使用这些函数的返回类型的包装器,因此它看起来像这样:
template <typename T>
decltype(Zero<decltype(declval<T>().x)>(decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()))) ZeroWrapper(const T);
template <typename T>
decltype(One<decltype(declval<T>().x)>(decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), bool())) OneWrapper(const T);
template <typename T>
decltype(Three<decltype(declval<T>().x)>(decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()), decltype(declval<decltype(declval<T>().x)>()))) ThreeWrapper(const T);
正如你所看到decltype(declval<T>().x)
的,所有这些都变得非常难以阅读。我可以模板 ausing
还是有一些标准函数允许我从函数指针中提取返回类型而不将参数类型传递给decltype
or result_of
?所以是这样的:
template <typename T>
foo_t<Zero<decltype(declval<T>().x)>> ZeroWrapper(const T);
template <typename T>
foo_t<One<decltype(declval<T>().x)>> OneWrapper(const T);
template <typename T>
foo_t<Three<decltype(declval<T>().x)>> ThreeWrapper(const T);
解决方案
我可以模板一个 using 还是有一些标准函数允许我从函数指针中提取返回类型而不将参数类型传递给
decltype
orresult_of
?
是的!
#include <tuple>
#include <functional>
template<class T>
struct callable_trait
{};
template<class R, class... Args>
struct callable_trait<std::function<R(Args...)>>
{
using return_type = R;
using argument_types = std::tuple<Args...>;
};
template<auto callable>
using return_type = typename callable_trait<decltype(std::function{callable})>::return_type;
return_type<some_callable>
some_callable
是使用适当参数调用时返回的类型。这使用 astd::function
来为每种可能的可调用类型(自由函数、函数指针、成员函数、函子对象)提供专门化。这在这个 StackOverflow 答案中进行了解释。
在您的情况下,您可以像这样使用它:
template <typename T>
bool Zero(const T, const T, const T);
template <typename T>
T One(const T, const T, const T, bool);
template <typename T>
T Three(const T, const T, const T, const T, const T, const T);
template <typename T>
return_type<Zero<T>> ZeroWrapper(const T);
template <typename T>
return_type<One<T>> OneWrapper(const T);
template <typename T>
return_type<Three<T>> ThreeWrapper(const T);
推荐阅读
- android - 我在 Ionic 5 中安装 Razorpay 插件后,Android Build 失败
- python - 如何检查一个对象是否有超过恒定数量的多对多字段对象
- r - 在 R 中创建一个分组条形图,其中条形未排列
- google-apps-script - SpreadsheetApp.getActive() 在一个 Google Workspace 域上工作,但不在另一个域上
- azure - 导入和导出时出现 Azure 存储 Dll 错误
- substrate - 执行 Delegator 示例时,出现“ContractTrapped”错误
- vba - 动态行引用 VBA
- nebular - 带角度的星云主题中缺少微调器 dorodownlist 组件?
- python - 仅合并非 NaN 值
- java - 如何实现过滤器在每个会话中只执行一次用户更新?