c++ - 让函数在不指定模板参数的情况下获取指向模板对象的指针

标签 c++ c++11 templates

这是我的情况。我有一个类,一个带有 int 模板参数的模板类,类似于这个。

template <int n>
class example
{
  bool some_method()
  {
     return n > 1;
  }
}

现在,我想做的是编写一个函数,它接受一个指向此类对象的指针并使用它。对于我必须做的事情,不需要知道模板参数,所有模板参数的代码看起来都一样。就像是:
bool function(example* part1, bool part2)
{
     return part1->some_method() && part2;
}

但显然编译器提示缺少模板参数。我有没有机会在不编写模板函数的情况下实现这样的函数?这个例子很小,但现实生活中的例子会更加冗长和复杂。

在启用 c++11 的 Gcc 4.8.1 上工作,https://godbolt.org/z/EXdCe9 goldbolt 上的示例以显示错误。

最佳答案

您将不得不使用某种形式的间接。在这种情况下,最明显的形式是继承和虚方法:

class example_base {
public:
  virtual bool some_method() = 0;
};

template <int n>
class example: public example_base {
public:
  virtual bool some_method() override
  {
     return n > 1;
  }
};

bool function(example_base* part1, bool part2)
{
  return part1->some_method() && part2;
}

如果您不能(或想要)修改原始类 example ,您可以使用虚拟方法创建一个包装器:
template <int n>
class example {
public:
  bool some_method()
  {
     return n > 1;
  }
};

class example_wrapper_base {
public:
  virtual bool some_method() = 0;
};

template <int n>
class example_wrapper: public example_wrapper_base {
public:
  example_wrapper_base(example<n>* e): e(e) {}
  virtual bool some_method() override { e->some_method(); }
private:
  example<n>* e;
};

bool function(example_wrapper* part1, bool part2)
{
  return part1->some_method() && part2;
}

关于c++ - 让函数在不指定模板参数的情况下获取指向模板对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62196594/

相关文章:

c++ - 存在 lambda 参数时 ADL 失败?

c++ - 向类中添加新成员变量会影响二进制兼容性吗?

不同类型的 C++ 模板错误

c++ - 关于自定义分配器和 STL 的模板声明、别名和特化说明

c++ - 从友元函数中的对象访问成员函数

c++ - 如何使用 C++14 和 C++1z 中的功能缩短此可变参数模板代码?

c++ - 无法启动程序,因为缺少 Qt5Cored.dll

c++ - 使用 cygwin 编译 C++ 不搜索提供的包含路径

c++ - future 的可组合性,以及 boost::wait_for_all

C++ 不需要的类型推导