在C++中推断函数或函子的返回类型

3 c++ generic-programming

我需要使用函数/函数的返回值,而不知道它是什么类型(即作为模板).

虽然我可以将它传递给第二个函数而没有问题:

template <typename T>
void DoSomething(T value);

...

DoSomething(FunctionWhoseReturnedTypeIsUnknown(...));
Run Code Online (Sandbox Code Playgroud)

我想使用返回的内联值(无需调用第二个函数):

WhatGoesHere? x=FunctionWhoseReturnedTypeIsUnknown(...);
Run Code Online (Sandbox Code Playgroud)

这两种方法在概念上看起来与我相同(generic-programming-wize),但后者是否可以在C++中实现?

Unc*_*ens 5

在auto关键字使其变得非常简单之前,可以依赖于函数对象提供某些typedef的约定,包括result_type.只需将普通函数包装到函数对象中即可.标准的"functional"头文件提供了一些(除了几个成员函数包装器之外还有pointer_to_unary_function/pointer_to_binary_function).当这些还不够时,boost库提供了更强大的包装器.

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>

int answer()
{
    return 42;
}

template <class T>
T unknown()
{
    return T();
}

template <class Function>
void foobar(Function unknown)
{
    typename Function::result_type x = unknown();
    std::cout << x << '\n';
}

int main()
{
    foobar(boost::function<int()>(answer));
    foobar(boost::bind(unknown<int>));
}
Run Code Online (Sandbox Code Playgroud)

以下是一个示例,您可以如何添加pointer_to_zeronary_function.(我想帮助你创建一个ptr_fun的辅助函数可能被添加到标准命名空间以及重载(?)

template <class T>
class pointer_to_zeronary_function
{
    typedef T(*zeronary_func)();
    zeronary_func func;
public:
    typedef T result_type;
    pointer_to_zeronary_function(zeronary_func f): func(f) {}
    T operator()() const
    {
        return func();
    }
};

template <class T>
pointer_to_zeronary_function<T> ptr_fun(T(*f)())
{
    return pointer_to_zeronary_function<T>(f);
}

...
//usage:
foobar(ptr_fun(answer));
Run Code Online (Sandbox Code Playgroud)