所以我有很多类似的功能:
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
还是有一些标准函数可以让我从函数指针中提取返回类型,而无需将参数类型传递给decltype
或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);
答案 0 :(得分:1)
我可以模板化using还是有一些标准函数,这些函数可以让我从函数指针中提取返回类型,而无需将参数类型传递给
decltype
或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);
答案 1 :(得分:0)
在c++17中,function
对象被赋予了Deduction Guide,这使得它可以根据传递给构造函数的参数来确定其类型。因此,例如,给定c++11中的函数int foo()
,我们必须这样做:
function<int()> bar(foo);
如果我们简单地在c++17 bar
的{{1}}类型中得出
function<int()>
因此,我们可以使用推导指南使用仅 签名填充临时function bar(foo);
;从而使用function
的{{1}}来查找辅助函数的结果:
function