template<class, class>模板参数为两个类

Apollo  hdmap_common.h 有段代码看不懂专门写了一个类似的双类模板

template <class Object, class GeoObject>
class ObjectWithAABox {
 public:
  ObjectWithAABox(const apollo::common::math::AABox2d &aabox,
                  const Object *object, const GeoObject *geo_object,
                  const int id)
      : aabox_(aabox), object_(object), geo_object_(geo_object), id_(id) {}
  ~ObjectWithAABox() {}
  const apollo::common::math::AABox2d &aabox() const { return aabox_; }
  double DistanceTo(const apollo::common::math::Vec2d &point) const {
    return geo_object_->DistanceTo(point);
  }
  double DistanceSquareTo(const apollo::common::math::Vec2d &point) const {
    return geo_object_->DistanceSquareTo(point);
  }
  const Object *object() const { return object_; }
  const GeoObject *geo_object() const { return geo_object_; }
  int id() const { return id_; }

 private:
  apollo::common::math::AABox2d aabox_;
  const Object *object_;
  const GeoObject *geo_object_;
  int id_;
};

双类模板 

#include <iostream>
using namespace std;

class IntClass {

  public:
    void IntFunction() {
      cout << "IntFunction" << endl;
    };
};

class DoubleClass {

  public:
    void DoubleFunction() {
      cout << "DoubleFunction" << endl;
    };
};

template <class IntClass, class DoubleClass> 
class IntDouble {
  public:
      void test() {
        int_class.IntFunction();
        double_class.DoubleFunction();
      };
  private:
    IntClass int_class;
    DoubleClass double_class;

};

int main()
{
  IntDouble<IntClass,DoubleClass> IntDoubleTest;
  IntDoubleTest.test();

  return 0; 
}


结果:
IntFunction
DoubleFunction



 双类模板的基础上调用函数

#include <iostream>
#include <memory>
#include "library.h"
using namespace std;


//定义第一个类
class IntClass {
  public:
    void IntFunction() {
      cout << "IntFunction" << endl;
    };

};


//定义第二个类,有个传参函数
class DoubleClass {
  public:
    void DoubleFunction() {
      cout << "DoubleFunction" << endl;
    };
    double DistanceTest(double a) {
      double a_;
      a_ = a;
      return a_;
    };
};


//创建一个双类的模板
template <class IntClass, class DoubleClass> 
class IntDouble {
  public:
      void test() {
        int_class.IntFunction();
        double_class.DoubleFunction();
      };
      //IntDouble模板创建一个DistanceTest()的函数
      double DistanceTest(double a) {
      //double_class调用自己的函数DistanceTest(),
        return double_class->DistanceTest(a);
      };
  private:
    IntClass *int_class;
    DoubleClass *double_class;
};

int main()
{
  double u = 20.2;
  IntDouble<IntClass,DoubleClass> IntDoubleTest;
  double e = IntDoubleTest.DistanceTest(u);
  cout << "e: " << e << endl;

  return 0; 
}



结果:
e: 20.2

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I.引言 在Basic(俺的入门语言),Pascal等语言中都提供了定长字符串型,各有特色,Basic的 是长度固定,超出截断,不足补空格;;pascal的是最大长度限制在某个范围. 虽然定长字符串有这样那样的缺点(例如长度有限,弄不好会丢失数据;;) 定长字符串还是有一定的好处,主要是: 1.不分配在堆上,从而不会造成内存碎片 2.静态分配内存,分配速度快 因此我写了一个定长字符串,用作轻量级的字符串.似于pascal的定长字符串,也采用也采取饱和的方式来处理溢出. II.简介 主要有: 1. template<;typename T,typename Traits=std::char_traits<;T>; >; class basic_small_string_base;; 这是定长字符串的基,适用于各种字符型,当然也支持";火星人的三字节字符";. 模板的代码主要实现在该中.该是抽象,不能够实例化. 2. template<;typename T, size_t MaxSize, typename Traits=std::char_traits<;T>; >; class basic_small_string;; // : public basic_small_string_base<;T,Traits>; 特定长度的定长字符串模板.如果C++标准支持模板typedef的话,下面的4的俩就不用再写了,遗憾的是还不支持,所以他也是抽象.//其实做成可实例化的也没任何问题。 3. typedef basic_small_string_base<;char, std::char_traits<;char>; >; small_string_base;; typedef basic_small_string_base<;wchar_t, std::char_traits<;wchar_t>; >; small_wstring_base;; 针对char和wchar_t(我特讨厌这后面的_t这根尾巴)两种字符型的基的和默认traits 的typedef.写函数参数型的时候可以少写几个字, ^=^ 4. template <;size_t MaxSize, typename Traits=std::char_traits<;char>; >; class small_string;; // : public basic_small_string<;char, MaxSize,Traits>; 这是定长字符串的基,适用于各种字符型,当然也支持";火星人的三字节字符";. 模板的代码主要实现在该中.该是抽象,不能够实例化. 2. template<;typename T, size_t MaxSize, typename Traits=std::char_traits<;T>; >; class basic_small_string;; // : public basic_small_string_base<;T,Traits>; 特定长度的定长字符串模板.如果C++标准支持模板typedef的话,下面的4的俩就不用 再写了,遗憾的是还不支持,所以他也是抽象.//其实做成可实例化的也没任何问题。 3. typedef basic_small_string_base<;char, std::char_traits<;char>; >; small_string_base;; typedef basic_small_string_base<;wchar_t, std::char_traits<;wchar_t>; >; small_wstring_base;; 针对char和wchar_t(我特讨厌这后面的_t这根尾巴)两种字符型的基的和默认traits 的typedef.写函数参数型的时候可以少写几个字, ^=^ 4. template <;size_t MaxSize, typename Traits=std::char_traits<;char>; >; class small_string;; // : public basic_small_string<;char, MaxSize,Traits>; template <;size_t MaxSize, typename Traits=std::char_traits<;wchar_t>; >; class small_wstring;; // : public basic_small_string<;char, MaxSize, Traits>; 真正能实例化的ANSI和WCHAR版本的定长字符串. III.用法 该模板用法和std::string一样,可以参考它的文档.另外为了兼容std::basic_string<;>;, 还提供了和std::string搭配的一些额外功能,比如函数的字符串参数都支持 std::basic_string.可以与std::basic_string<;>;进行比较,转换,连接等. 1. 包含头文件 #include";small_string.hpp"; 2.引入cfc命名空间 using namespace;; // 可以略去 3.实例化对象 cfc::small_string<;16>; s=";hello";;; // 一个缓冲区长度为16的定长字符串,内容为";hello"; // 最大长度为15,而不是16,注意! 作局部变量时效率上基本上等于 char s[]=";hello";;;低于char *s=";hello";;;原因很简单. 可以和std::string协同操作: std::string s3 = s;; s = s3;; 4.作为函数参数 作为非模板函数的参数传递时,参数型应该写成cfc::small_string_base&或者 cfc::small_wstring_base& ,根据需要,可以加上const: void foo(cfc::small_string_base& str) { str=";hello";;; } int main() { cfc::small_string<;32>; s;; foo(s);; } 其他插入,比较,删除等操作跟std::string一样 IV.实现 利用模板的最大缓冲区长度参数,实例化模板,把缓冲区作为数组直接建立在对象的内部. 为了减少代码膨胀,大部分功能都移入基. V.结尾. 由于时间仓促,经历有限,经验不足,缺点错误肯定不少,欢迎大家批评指正. 谢谢!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值