c++ - 如何在虚方法上使用模板参数类?

标签 c++ oop templates c++11

我知道在虚方法上使用模板是不可能的,因为编译没有办法知道如何实现所有的可能性,但我需要的是以受限的方式使用模板,就像这样:

template<typename T, size_t N>
class MatBase {
 public:
  static constexpr size_t order = N;

  using value_type = T;

  MatBase() = default;
  virtual ~MatBase() = default;

  template<class Fn = T(T)>
  virtual void Map(Fn&& fn) = 0;

  template<class Fn = T(T,T)>
  virtual T Reduce(Fn&& fn) = 0;
};

这意味着,Fn 使用在类上声明的模板,所以我认为编译器可以推断出所有可能的类型。有没有办法做类似 C++ 的事情?

最佳答案

正如您所说,您不能拥有模板化虚函数。然而,为什么你需要模板呢?请参阅以下示例代码。

示例代码

#include <cstddef>

template<typename T, size_t N>
class MatBase
{
public:
    static constexpr size_t order = N;

    using MapFn = T (*)(T);

    using ReduceFn = T (*)(T, T);

    using value_type = T;

    MatBase() = default;
    virtual ~MatBase() = default;

    virtual void Map(MapFn&& fn) {}

    virtual T Reduce(ReduceFn&& fn) {}
};

int main()
{
    MatBase<int, 3> m;
    return 0;
}

Live Example


更灵活的解决方案可以考虑使用 std::function (例如,std::function<T (T)>)用于参数,因为它为调用者提供了更大的灵 active 。例如,调用者可以使用普通函数、成员函数、lambda 表达式或仿函数对象。

关于c++ - 如何在虚方法上使用模板参数类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958890/

相关文章:

c++ - 我如何使这个 For 循环在这个问题上起作用?

c++ - 如何将 switch-case 语句更改为 if-else 语句

mysql - 使用 oop 进行 SQL 查询编程的优势

c++ - 这是虚拟成员函数模板吗?

c++ - 具有类型特征的通用 lambda

c++ - C++中牛顿方法的函数

c++ - 什么哈希算法用于快速文件哈希?

Python 面向对象编程

perl - 使用 `bless` 创建具有继承的对象

c++ - 未定义引用 C++ 队列模板处理字符串