在 class 定义中获取 input/output 类型的可调用对象
Get input/output type of callable within a class definition
我有以下问题:
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;
}
正如你在上面看到的,我尝试实现一个 class A
其函数 operator()
将函数 _f
映射到输入向量的每个元素 input
.
我的问题如下:我希望输入向量 input
的元素具有 _f
(即 T_in
)的输入类型和输出的元素向量 _f
的输出类型(即 T_out
),但没有将 _f
的 input/output 类型显式传递给 class A
,我用于类型推导的函数 A_wrapper
and/or 函数 operator()
(由于代码的可读性更好)。
有谁知道如何在编译时自动推导出 _f
的 input/output 类型?
非常感谢。
顺便说一句:这里的问题和我之前的post
有关
, :您可以使用 std::result_of_t
从 input
向量和 T_out
推导出 T_in
#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。
我有以下问题:
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;
}
正如你在上面看到的,我尝试实现一个 class A
其函数 operator()
将函数 _f
映射到输入向量的每个元素 input
.
我的问题如下:我希望输入向量 input
的元素具有 _f
(即 T_in
)的输入类型和输出的元素向量 _f
的输出类型(即 T_out
),但没有将 _f
的 input/output 类型显式传递给 class A
,我用于类型推导的函数 A_wrapper
and/or 函数 operator()
(由于代码的可读性更好)。
有谁知道如何在编译时自动推导出 _f
的 input/output 类型?
非常感谢。
顺便说一句:这里的问题和我之前的post
std::result_of_t
input
向量和 T_out
推导出 T_in
#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。