0

所以我有很多类似于这些的功能:

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还是有一些标准函数允许我从函数指针中提取返回类型而不将参数类型传递给decltypeor 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);
4

2 回答 2

1

我可以模板一个 using 还是有一些标准函数允许我从函数指针中提取返回类型而不将参数类型传递给decltypeor 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是使用适当参数调用时返回的类型。这使用 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);

完整演示

于 2019-03-04T14:07:42.247 回答
0

中,function对象被赋予了一个演绎指南,允许它从传递给构造函数的参数中确定它的类型。例如,给定int foo()中的函数,我们必须这样做:

function<int()> bar(foo);

bar中,function<int()>如果我们简单地导出类型:

function bar(foo);

因此,我们可以使用 Deduction Guide仅function使用签名填充临时;从而使用's来查找您的辅助功能的结果:functionresult_type

template <typename T>
typename decltype(function(Zero<decltype(declval<T>().x)>))::return_type ZeroWrapper(const T);
template <typename T>
typename decltype(function(One<decltype(declval<T>().x)>))::return_type OneWrapper(const T);
template <typename T>
typename decltype(function(Three<decltype(declval<T>().x)>))::return_type ThreeWrapper(const T);

Live Example

于 2019-03-04T19:07:57.620 回答