函数返回C ++ 11中的函数指针

时间:2013-12-11 20:07:53

标签: c++ c++11 function-pointers

我有以下C代码:

inline void ChooseNext ( std::vector<RLS> & rls_vec_left_to_choose_,
           int & num_files_left_to_choose_, const int algo_,
           std::vector<RLS> & rls_vec_chosen_ )
{
if ( ( num_files_left_to_choose_ > 0 )
 && ( rls_vec_left_to_choose_.size ( ) > 0 ) )
  {
    switch ( algo_ )
      {
      case kAlgo1 :
        std::sort ( rls_vec_left_to_choose_.begin ( ), rls_vec_left_to_choose_.end ( ), SortFunc1 );
        break;
      case kAlgo2 :
      default:
        std::sort ( rls_vec_left_to_choose_.begin ( ), rls_vec_left_to_choose_.end ( ), SortFunc2 );
        break;
      }
      // etc
   }
 }

排序函数的所有类型都是:

bool SortFunc1 ( const RLS & d1, const RLS & d2 ) ;

如何将其更改为带const int algo_并返回bool (*) ( const RLS & d1, const RLS & d2 )的函数,然后删除此函数中的开关案例? 我试图以尽可能可读的方式进行,并希望使用C ++ 11功能。

2 个答案:

答案 0 :(得分:3)

如果是C ++,为什么要返回一个函数指针?您可以改为使用std::function

std::function<bool(const RLS &, const RLS &)> ChooseNext(int algo)
{
    static const std::vector<std::function<bool(const RLS &, const RLS &)>> st {
        SortFunc1,
        SortFunc2,
        // etc.
    };

    return st[algo]; // assuming that `algo` goes from 0 to st.size()
}

如果你真的需要一个函数指针,那么这里是你如何声明一个函数返回一个函数指针:

bool (*ChooseNext())(const RLS &, const RLS &)
{
    // whatever
}

答案 1 :(得分:1)

虽然使用std::function<bool(RLS const&, RLS const&)有一些优点,但创建一个函数指针撤销函数很有意思。最简单但也最无聊的方法是使用typedef

typedef bool (*CompareFunction)(RLS const&, RLS const&);
CompareFunciton getFunction(int algo) {
    switch (algo) {
    case kAlgo1: return &SortFunc1;
    case kAlgo2: return &SortFunc2;
    default: assert("algo selection value out of range");
    }
    return &SortFunc1; // ... or somehow deal with the situation
 }

好的,我对处理实际功能的选择并不感兴趣,而只对getFunction()的声明方式感兴趣。显然,有几种方法可以处理algo超出范围(assert()throw,使用默认值,...)。对于其他人,我不会改变实施,只会改变声明。

typedef可以做什么也可以不用!所以,这里是没有使用typedef的C ++ 03版本:

bool (*getFunction(int algo))(RLS const&, RLS const&) { ... }

好的,这看起来很奇怪,但您可以将其视为用实际函数替换typedef。要阅读它的内容,您需要从右到左阅读类型。无论如何,上述声明都是温和的,可怕的。使用C ++ 11,可以使用尾随返回类型:

auto getFunction(int algo) -> bool(*)(RLS const&, RLS const&) { ... }

我认为这种符号非常易读。使用函数指针的尾随返回类型可以完成,但不一定提高可读性,我想(但是,我可能只是太老了):

auto getFunction(int algo) -> auto (*)(RLS const&, RLS const&) -> bool { ... }