C ++找到函数返回类型

时间:2014-03-01 20:15:47

标签: c++ arrays

我对C ++很陌生,不太清楚我需要提供什么才能提供最低限度的可重复示例,但无论如何这是我的问题:

在C ++中,我想创建一个函数(f1),它能够将另一个函数(f2)作为输入,在循环中进行评估并记录/输出。

但是根据函数的输出类型(f2),f1的输出必须改变。即如果f2输出一个double,那么我将需要一个数组/向量作为f1的输出类型,但如果f2输出一个数组/向量,那么我将需要一个二维数组/矩阵作为f1的输出类型。在执行循环返回类型f1之前,有什么能够帮助我找到的吗?

我非常感谢您能提供的任何帮助或示例。

4 个答案:

答案 0 :(得分:3)

听起来你正在寻找模板。您可以从这里开始:http://en.wikipedia.org/wiki/Template_%28C%2B%2B%29此处:http://msdn.microsoft.com/en-us/library/y097fkab.aspx或此处:http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1

模板允许您编写一次函数或类,并使其适用于不同的数据类型。请记住,如果代码必须在数据类型之间进行更改,则需要更复杂的模板 - 专业化 - 或者可能是模板不是您需要的。

答案 1 :(得分:1)

听起来像模板的作品

http://www.tutorialspoint.com/cplusplus/cpp_templates.htm

一定要让你的功能一般工作,对于很多类型我指的是f1和f2。如果要使用计算和比较,可能需要为自定义类创建运算符。

答案 2 :(得分:0)

模板是正确的方法。这是一个函数,它接受任何可调用对象f,并返回返回类型的std::array(随机选择的5个元素),其中填充了调用函数(live example)的返回值:

template<typename F>
auto foo(F f) -> std::array<decltype(f()), 5> { //decltype(f()) is return type
    std::array<decltype(f()), 5> ret;
    std::fill(std::begin(ret), std::end(ret), f()); //fill ret with values
    return ret;
}

请注意,如果传入的函数包含任何参数,则唯一更改的是f(),在所有情况下,都需要变为f(arg1, arg2, ...)。另请注意,这会为数组填充一次调用f的结果副本。如果您想为每个元素调用f一次,请使用std::generate并将f()替换为f。但是,如果您确实使用了std::generate,并且该函数具有参数,那么您必须使用类似std::bind的内容,而这实际上是在脱离主题。

答案 3 :(得分:0)

查找普通函数的结果类型的最简单方法是使用std::function恕我直言。

#include <functional>
#include <iostream>
#include <typeinfo>
#include <type_traits>
#include <vector>
using namespace std;

template< class Function >
using Pure_function_ = typename remove_pointer<Function>::type;

template< class Function >
using Result_type_ = typename function<Pure_function_<Function>>::result_type;

template< class Function >
auto three_times( Function f )
    -> vector< Result_type_<Function> >
{
        vector< Result_type_<Function> > result;
        for( int x : {1, 2, 3} )
        {
            result.push_back( f( x ) );
        }
        return result;
}

auto double_foo( int x ) -> double { return 2*x; }
auto vector_foo( int x ) -> vector<int> { return vector<int>( 5, 3*x ); }

auto main()
    -> int
{
    auto const  a   = three_times( double_foo );
    cout << typeid( function<decltype(double_foo)>::result_type ).name() << endl;

    auto const  b   = three_times( vector_foo );
    cout << typeid( b ).name() << endl;

    auto const  c   = three_times( &vector_foo );
    cout << typeid( c ).name() << endl;    // Same as above.
}