获取 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。