获取 input/output 类型的可调用对象
Get input/output type of callable
我有以下问题:
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
的 input/output 类型显式传递给 foo
(由于代码的可读性更好)。有谁知道如何在编译时自动推导出 f
的 input/output 类型?
非常感谢。
使用映射函数其实很常见的设计模式是c++。我建议您为此使用 std::Map 容器。 here is a link.
祝你好运:)
decltype
将适用于此,同时将 foo
的 return 类型更改为 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;
}
类型 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。
我有以下问题:
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
的 input/output 类型显式传递给 foo
(由于代码的可读性更好)。有谁知道如何在编译时自动推导出 f
的 input/output 类型?
非常感谢。
使用映射函数其实很常见的设计模式是c++。我建议您为此使用 std::Map 容器。 here is a link.
祝你好运:)
decltype
将适用于此,同时将 foo
的 return 类型更改为 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;
}
类型 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。