|
发表于 2020-1-7 18:31:16
|
显示全部楼层
这样可以吗?
你既然想在GetData后面指定类型,那为什么不能在GetData后面先加.access然后再加类型
GetData后面不能加类型,因为GetData函数不能用模板
写这个代码的时候遇到了一些概念上的问题
- class IA
- {
- public:
- virtual ~IA() = 0;
- virtual uint64_t id() = 0;
- virtual data_t get_data() = 0;
- };
- // 没办法,子类要求这个函数
- IA::~IA()
- {
- }
复制代码
子类要求IA有一个析构函数,IA中的函数必须都是纯虚函数
子类还要求这个析构函数有实现代码,然后就写成了上面这样
这样的IA还能称得上是接口吗?我百度不到结果
- #include <iostream>
- #include <string>
- class data_t
- {
- public:
- template <typename T>
- data_t(const T &n, void (*free_pointer)(void *)): value(new T(n)), free_pointer(free_pointer)
- {
- }
- ~data_t()
- {
- // 当前类不知道这个指针指向的类型,无法删除这个指针,让创建者(创建当前对象的代码)来删除
- // 我尝试过在当前类中保存指针的类型,但是失败了
- this->free_pointer(this->value);
- }
- template <typename T>
- T access()
- {
- return *static_cast<T *>(this->value);
- }
- private:
- void *value;
- void (*free_pointer)(void *p);
- };
- class IA
- {
- public:
- virtual ~IA() = 0;
- virtual uint64_t id() = 0;
- virtual data_t get_data() = 0;
- };
- // 没办法,子类要求这个函数
- IA::~IA()
- {
- }
- template <typename T>
- class A: public IA
- {
- public:
- A(const T &n): data(n) {}
- uint64_t id()
- {
- return uint64_t(this);
- }
- data_t get_data()
- {
- return data_t(data, this->free_pointer);
- }
- private:
- T data;
- static void free_pointer(void *p)
- {
- delete static_cast<T *>(p);
- }
- };
- int main(void)
- {
- IA *p = new A<int>(5);
- std::cout << p->id() << std::endl;
- std::cout << p->get_data().access<int>() << std::endl;
- delete p;
- p = new A<std::string>("fishc.com");
- std::cout << p->id() << std::endl;
- std::cout << p->get_data().access<std::string>() << std::endl;
- std::string s = p->get_data().access<std::string>();
- //int i = p->get_data().access<std::string>();
- delete p;
- return 0;
- }
复制代码 |
|