【问题标题】:Passing template function and overload as function argument传递模板函数和重载作为函数参数
【发布时间】:2015-11-23 18:02:53
【问题描述】:

短版:将函数指针作为参数传递给另一个函数时,是否可以混合使用模板函数和重载?

详细信息:我在模板函数中使用std::search,我想根据模板的类型来控制用于比较的函数,例如对char* 使用一个函数调用strcmp,对其他类型使用operator==

到目前为止,我正在使用模板仿函数,专门用于 char*,如下所示:

Comparator<T> comparator;
std::search(....., comparator);

也就是说,没有模板函数的模板特化之类的东西,因为它们是简单的重载。那么,在这种情况下,我是否坚持使用函子?

【问题讨论】:

    标签: c++ templates c++11 overloading


    【解决方案1】:

    函数模板没有部分特化。但我认为您可能有一个更大的误解:“传递函数指针时是否可以混合模板函数和重载......”创建函数指针时会发生重载解析。一旦创建了函数指针,就不再有任何混合。

    也就是说,您似乎想要的是一个政策。当你不知道名字时很难用谷歌搜索,我知道。

    【讨论】:

      【解决方案2】:

      具有完整模板专业化的解决方案:

      #include <string.h>
      
      #include <vector>
      #include <algorithm>
      
      // template function "MyComperator"
      template<class T>
      bool MyComperator( T a, T b ) {
          return a < b;
      }
      // full template specialization for function "MyComperator" with type "char*"
      template<>
      bool MyComperator<char*>( char *a, char *b ) {
          return strcmp( a, b ) < 0;
      }
      
      int main() {
      
          std::vector<int> v1;
          v1.push_back( 3 );
          v1.push_back( 2 );
          v1.push_back( 1 );
          std::sort( v1.begin(), v1.end(), &MyComperator<int> );
      
          std::vector<char*> v2;
          v2.push_back( "C" );
          v2.push_back( "B" );
          v2.push_back( "A" );
          std::sort( v2.begin(), v2.end(), &MyComperator<char*> );
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2023-03-26
        • 2017-06-14
        相关资源
        最近更新 更多