我有一个采用模板 size_t 参数的基类和 2 个派生类,将模板参数提供给基类。
template<size_t N>
class BaseClass
{
size_t value = N;
};
class Derived1 : public BaseClass<1>
{};
class Derived2 : public BaseClass<2>
{};
现在我想在从 Baseclass 派生的任何类上创建一个模板函数。所以我想在通用类 T 上创建一个模板,并使用 std::is_base_of_v(...) 的要求来确保 T 是一个 BaseClass。
给出父类时的问题我还需要精确存储在 T 中的 size_t 模板参数。
我最终得到以下结果:
template<class T>
requires std::is_base_of_v<BaseClass<T.value>, T>
void
function(T arg) {};
显然这不能编译,因为 T 是一个通用类并且不包含属性值,我发现解决这个问题的唯一方法是向函数添加另一个 size_t 模板参数并在 BaseCLass 中使用它:
template<class T, size_t N>
requires std::is_base_of_v<BaseClass<N>, T>
void
function(T arg) {};
这(应该)可行,但我对这个解决方案不太满意,因为最终我得到了一个冗余的 N,我必须手动将它赋给函数模板以及已经保存了该值的派生类。有什么办法可以解决这个问题吗?