从模板<base /> </derived>派生所有模板<derived>实例

时间:2014-07-31 13:25:30

标签: c++ templates inheritance c++11

是否可以从具有基类作为其参数的实例化派生所有具有派生类作为其参数的模板实例?

在代码中:

class Base{};

class Derived1 : Base{};

class Derived2 : Base{};

template<typename T>
class Templ /*: Templ<Base> if T derives from Base*/ 
{};

如何做到这一点?

2 个答案:

答案 0 :(得分:4)

Templ<Base>进行专门化,然后使用SFINAE和std::is_base_ofTempl<Base>派生单独的专业化。

template<typename T, typename V = void>
class Templ 
{};

template<>
class Templ<Base>
{};

template<bool B, typename R = void>
using enable_if_t = typename std::enable_if<B, R>::type;

template<typename T>
class Templ<T, enable_if_t<std::is_base_of<Base, T>::value>>
    : public Templ<Base>
{};

答案 1 :(得分:1)

这取决于你想要做什么。如果您希望这仅适用于某些特定的已知基类,则可以轻松实现,例如,比如在0x499602D2的答案中。

然而,我解释你的问题的方式你想要一个模板,该模板源自它的参数baseclass的实例化,无论哪个可能。这在标准c ++(还)中是不可能的,因为没有办法查询特定类型派生自哪个类,只有它是从特定类派生的。有关此问题的更多信息(以及可能的未来解决方案,请查看this question