在 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。