当A
是一个模板类时,有没有一种方法可以测试std::is_base_of<A, B>
?
template <typename X, typename Y> class A {};
template <typename X> class B : public A<X, char> {};
我想静态地测试一些东西,比如,std::is_base_of<A, B<int>>
,意思是,B
是从A
的任何特殊化中派生出来的。(为了使其更一般化,假设我们不知道B
专门化A
的方式,即B派生自A<X,char>)
一种解决方法是从一个(非模板)类(比如C
)派生A,然后检查std::is_base_of<C, B<int>>
。但还有别的办法吗?
4条答案
按热度按时间k5ifujac1#
您可以执行以下操作:
Live Demo
但会因
A
的多继承或私有继承而失败。在Visual Studio 2017中,当基类模板具有多个模板参数并且无法推断
Ts...
时,这将失败Demo
VS Bug Report
重构解决了VS的问题。
Live Demo
dzhpxtsq2#
有点晚了党在这里,但我想给予一个变种以上
这使用了建议的is_detected机制,我认为这使得测试的意图更清晰一些。然而,我现在可以同时获得基类示例化的类型,我发现这很有用。这样我就能写作了
7vhp5slm3#
以下解决方案适用于受保护的继承。
令人惊讶的是,在VS2017上,它可以从同一个模板进行多重继承,比如C< int >和Cboth< float >。)
检查Link to test code
w6lpcovy4#
根据叶夫根尼·马蒙托夫的回答,我认为正确的解决方案是