在类定义中获取可调用的输入/输出类型

时间:2016-10-18 13:55:59

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

我有以下问题:

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;
}

如上所示,我尝试实现一个类A,其函数operator()将函数_f映射到输入向量input的每个元素。

我的问题如下:我希望输入向量input的元素的输入类型为_f(即T_in),输出向量的元素为输出类型为_f(即T_out),但没有明确地将_f的输入/输出类型传递给类A,我的函数A_wrapper用于类型推导和/或函数operator()(由于代码的可读性更好)。 有谁知道如何在编译时自动推导出_f的输入/输出类型?

非常感谢提前。

顺便说一句:这里的问题与我之前的帖子Get input/output type of callable

有关

1 个答案:

答案 0 :(得分:1)

Same questionsame answer:您可以使用T_in

input向量和T_out推断std::result_of_t
#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。