gpt4 book ai didi

c++ - 我可以从签名中获取函数的返回类型吗?

转载 作者:行者123 更新时间:2023-11-28 04:23:14 25 4
gpt4 key购买 nike

所以我有很多类似于这些的函数:

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)变得难以阅读。我可以模板 using或者是否有一些标准函数允许我从函数指针中提取返回类型而不将参数类型传递给 decltyperesult_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);

最佳答案

Can I template a using or is there some standard function which will allow me to extract the return type from a function pointer without passing the argument types to decltype or result_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 返回的类型当用适当的参数调用时。这使用 std::function以便为每种可能的可调用类型(自由函数、函数指针、成员函数、仿函数对象)提供特化。这是 explained in this StackOverflow answer .


在你的情况下,你可以像这样使用它:

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);

Full demo

关于c++ - 我可以从签名中获取函数的返回类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54984669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com