C ++用模板实现std :: function

时间:2014-04-29 09:58:33

标签: templates c++11 variadic-templates

我想实现相当于std :: function的函数。它应该通过指向函数来创建仿函数。模板的第一种类型应该是函数的返回类型,下一种类型是参数的类型。但是我想支持具有可变参数数量的函数。到目前为止,这是我的代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

template< typename T, typename... A >
struct create_functor
{
    template < typename T ( *function )( A ) > // here I get an error
    struct functor
    {
        T operator()( A... arguments )
        {
            return function( arguments );
        }
    };
};

bool less_than( const int& a, const int& b )
{
    return a < b;
}

create_functor< bool, const int&, const int& >::functor< &less_than > less_than_int;

//auto less_than_int_a = std::function< bool(int,int) >( less_than ); 

int main()
{
    vector<int> sample;
    sample.push_back( 1 );
    sample.push_back( 0 );
    sample.push_back( 3 );
    sample.push_back( -1 );
    sample.push_back( -5 );

    sort( sample.begin(), sample.end(), less_than_int );

    for( int a : sample )
    {
        cout << a << " ";
    }

    cout << endl;

    return 0;
}

我似乎无法将参数包从外部模板传递到内部模板(它将指针指向函数)

关于如何将可变数量的类型传递给函数声明的任何想法都将受到赞赏。

感谢:)

1 个答案:

答案 0 :(得分:0)

更改

template < typename T ( *function )( A ) >

template < T ( *function )( A... ) >

我也会改变:

{ T operator()( A... arguments ) { return function( arguments ); }

{
  template<typename...Ts>
  T operator()( Ts&&... arguments ) const {
    return function( std::forward<Ts>(arguments)... );
  }

为了提高效率。然后我再也不确定其中的任何一点。