女士们,先生们,
请参阅下面的编码示例(运行源代码)。我的问题是让这个例子更优雅。
这段代码是什么:我有一个类CRTP
,它通过将函数DT
注入派生类来装饰它的派生类func
。此派生类为A
和B
。此外,B
也来自A
。在查看表达式func()
时,在尝试解析调用哪个b.func()
方法时,这将导致编译时的ambiguitiy。要解决此歧义,需要将using CRTP< B >::func
添加到课程B
。另请注意,由于func
方法的返回类型,它始终是返回的DT
类型。
我的问题是:是否有更简单/更快捷的方式来“忽略”或“禁用”通过B
的间接继承引入类CRTP< A >
的那些部分,而不是明确使用{{1}每个using
方法的短语? (想象一下,CRTP< A >
将有更多的方法(可能是类型),它将添加到它的CRTP
类中。
非常感谢您的时间和见解
DT
答案 0 :(得分:1)
可悲的是,没有。你的方法是C ++最好的方法。没有办法&#34;忽略&#34;通过CRTP<A>
的间接继承引入的部分。当您实现继承时,您对编译器做出了严格的承诺,即派生类实际上将包含其基类的公共和受保护功能。
答案 1 :(得分:1)
我担心你会使用多重继承将自己画成一个角落。
如果你可以拥有线性继承:B -> CRTP<B, A> -> A -> CRTP<A>
那么你就是金牌,因为CRTP<B, A>::func
会“自然地”隐藏A::func
(本身继承自CRTP<A>
)。
如果你总是继承同一级别,那很容易;否则会变得非常复杂。请参阅demo:
template< typename DT, typename... Bases >
struct CRTP: private Bases...
{
friend DT; // so that DT can access the private bases
DT func( void ) { return DT(); }
};