我有以下问题:
template< typename Func >
class A
{
public:
A( Func f ) : _f( f ) {}
// ...
template< typename T_in = /*input type of _f */, typename T_out = /*output type of _f */ >
std::vector<T_out> operator()( 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;
}
private:
Func _f;
// ...
};
template< typename Func >
A<Func> A_wrapper( Func f )
{
return A<Func>( f );
}
int main()
{
// example for f(x) = x*x
std::vector<float> input = { /* ... */ };
auto f = []( float in ){ return in*in; };
auto map_square = A_wrapper( f );
auto res = map_square( input );
return 0;
}
如上所示,我尝试实现一个类A
,其函数operator()
将函数_f
映射到输入向量input
的每个元素。
我的问题如下:我希望输入向量input
的元素的输入类型为_f
(即T_in
),输出向量的元素为输出类型为_f
(即T_out
),但没有明确地将_f
的输入/输出类型传递给类A
,我的函数A_wrapper
用于类型推导和/或函数operator()
(由于代码的可读性更好)。
有谁知道如何在编译时自动推导出_f
的输入/输出类型?
非常感谢提前。
顺便说一句:这里的问题与我之前的帖子Get input/output type of callable
有关答案 0 :(得分:1)
Same question,same answer:您可以使用T_in
input
向量和T_out
推断std::result_of_t
#include <vector>
#include <functional>
template< typename Func >
class A
{
public:
A( Func f ) : _f( f ) {}
// ...
template< typename T_in,
typename T_out = std::result_of_t<Func(T_in)>>
std::vector<T_out> operator()( 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;
}
private:
Func _f;
// ...
};
template< typename Func >
A<Func> A_wrapper( Func f )
{
return A<Func>( f );
}
int main()
{
// example for f(x) = x*x
std::vector<float> input = { /* ... */ };
auto f = []( float in ){ return in*in; };
auto map_square = A_wrapper( f );
auto res = map_square( input );
return 0;
}
使用typename std::result_of<Func(T_in)>::type
代替std::result_of_t<Func(T_in)>
也适用于C ++ 11,不仅适用于C ++ 14。