我知道在虚方法上使用模板是不可能的,因为编译没有办法知道如何实现所有的可能性,但我需要的是以受限的方式使用模板,就像这样:
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;
}
更灵活的解决方案可以考虑使用 std::function
(例如,std::function<T (T)>
)用于参数,因为它为调用者提供了更大的灵 active 。例如,调用者可以使用普通函数、成员函数、lambda 表达式或仿函数对象。
关于c++ - 如何在虚方法上使用模板参数类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958890/