获取可调用的输入/输出类型

时间:2016-10-18 12:58:19

标签: c++ c++14 callable template-deduction

我有以下问题:

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的输入/输出类型?

非常感谢提前。

3 个答案:

答案 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_outstd::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

祝你好运:)