【问题标题】:Enforcing templated base-class types with mixins使用 mixins 强制执行模板化基类类型
【发布时间】:2021-10-01 00:56:57
【问题描述】:

我有以下(不是为了编译,而是为了有效地说明这个概念)

class abstract_mixin {
...
}

template<class X>
class concrete_mixin_A : public abstract_mixin, public X {
...
}

这里,abstract_mixin 定义了一个 mixins 家族,concrete_mixin_A 是该家族的一个成员(将有 _B、_C 等等)。另外,我有一个类家族,mixin 家族中的任何 mixin 都可以与这些类一起使用(即上面的 X 模板参数:

class abstract_mixin_compat {

}

class concrete_mixin_compat_A : public abstract_mixin_compat {
...
}

class concrete_mixin_compat_B : public abstract_mixin_compat {
...
}

然后我可以做concrete_mixin_A &lt; concrete_mixin_compat_B &gt;。

现在我有了第三类对对象进行操作的类。我想将其限制为(从逻辑上讲)符合abstract_mixin &lt; abstract_mixin_compat &gt; 的实例,以便允许上述所有组合和派生类。

所以我有一个带有模板参数T 的类,它允许所有类型...

template < class T >
class DoStuff {
...
     do_some_stuff( ... accept all instances ... )

     // Possibly also track the instance of T
     T t_instance;
}

如何通过语法或其他方式实现这一目标?

【问题讨论】:

标签: c++ templates inheritance mixins


【解决方案1】:

是的,这是可能的。

template <template <class> class A, class B>
void mixin_checker(const A<B>&) 
   requires (std::is_base_of_v<abstract_mixin, A<B>> && 
             std::is_base_of_v<abstract_mixin_compat, B>)
{}   
              
template <class T>
concept my_mixin = requires(T t) {
    mixin_checker(t);
};

template <my_mixin T> 
class DoStuff {
   ...
};

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2012-01-09
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多