我有以下问题:
template<typename Func, typename T_in = /*input type of Func */, typename T_out = /*output type of Func */>
std::vector<T_out> foo( Func f, const std::vector<T_in>& input)
{
std::vector<T_out> res( input.size() );
for( size_t i = 0 ; i < input.size() ; ++i )
res[ i ] = f( input[ i ] );
return res;
}
int main()
{
// example for f(x) = x*x
std::vector<float> input = { /* ... */ };
auto res = foo( [](float in){ return in*in; }, input );
return 0;
}
正如您在上面所看到的,我尝试实现一个函数foo
,它将函数f
映射到输入向量input
的每个元素。我的问题如下:我希望输入向量input
的元素的输入类型为f
(即T_in
),输出向量的元素为输出类型f
(即T_out
)但没有明确地将f
的输入/输出类型传递给foo
(由于代码的可读性更好)。有谁知道如何在编译时自动推导出f
的输入/输出类型?
非常感谢提前。
答案 0 :(得分:2)
decltype
可以为此工作,同时将foo
的返回类型更改为auto
。
template<typename Func, typename T_in>
auto foo( Func f, const std::vector<T_in>& input)
{
std::vector<decltype(f(input[0]))> res( input.size() );
for( size_t i = 0 ; i < input.size() ; ++i )
res[ i ] = f( input[ i ] );
return res;
}
int main()
{
// example for f(x) = x*x
std::vector<float> input = { /* ... */ };
auto res = foo( [](float in){ return in*in; }, input );
return 0;
}
答案 1 :(得分:1)
T_in
类型可以从input
向量中推断出来。
我认为扣除T_out
是std::result_of_t
template <typename Func, typename T_in,
typename T_out = std::result_of_t<Func(T_in)>>
std::vector<T_out> foo( Func f, const std::vector<T_in>& input)
{
std::vector<T_out> res( input.size() );
for( size_t i = 0 ; i < input.size() ; ++i )
res[ i ] = f( input[ i ] );
return res;
}
使用typename std::result_of<Func(T_in)>::type
代替std::result_of_t<Func(T_in)>
也适用于C ++ 11,不仅适用于C ++ 14。
答案 2 :(得分:0)
使用函数映射实际上非常常见的设计模式是c ++。我建议你使用std :: Map容器。 here is a link
祝你好运:)