我对C ++很陌生,不太清楚我需要提供什么才能提供最低限度的可重复示例,但无论如何这是我的问题:
在C ++中,我想创建一个函数(f1),它能够将另一个函数(f2)作为输入,在循环中进行评估并记录/输出。
但是根据函数的输出类型(f2),f1的输出必须改变。即如果f2输出一个double,那么我将需要一个数组/向量作为f1的输出类型,但如果f2输出一个数组/向量,那么我将需要一个二维数组/矩阵作为f1的输出类型。在执行循环返回类型f1之前,有什么能够帮助我找到的吗?
我非常感谢您能提供的任何帮助或示例。
答案 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.
}