使用C++中的模板检查继承

JSN*_*JSN 2 c++ java templates

我有一个类,它是一个包装类(作为一个通用接口)围绕另一个实现所需功能的类.所以我的代码看起来像这样.

template<typename ImplemenationClass> class WrapperClass {
// the code goes here
}
Run Code Online (Sandbox Code Playgroud)

现在,我如何确保ImplementationClass只能从一组类派生,类似于java的泛型

<? extends BaseClass>
Run Code Online (Sandbox Code Playgroud)

句法?

Dan*_*mes 7

它很冗长,但你可以这样做:

#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_base_of.hpp>

struct base {};

template <typename ImplementationClass, class Enable = void>
class WrapperClass;

template <typename ImplementationClass>
class WrapperClass<ImplementationClass,
      typename boost::enable_if<
        boost::is_base_of<base,ImplementationClass> >::type>
{};

struct derived : base {};
struct not_derived {};

int main() {
    WrapperClass<derived> x;

    // Compile error here:
    WrapperClass<not_derived> y;
}
Run Code Online (Sandbox Code Playgroud)

这需要与标准的良好支持编译器(最近编译器应该是Visual C++会不会是好的,但旧版本).有关更多信息,请参阅Boost.Enable_If文档.

正如Ferruccio所说,一个更简单但功能更弱的实现:

#include <boost/static_assert.hpp>
#include <boost/type_traits/is_base_of.hpp>

struct base {};

template <typename ImplementationClass>
class WrapperClass
{
    BOOST_STATIC_ASSERT((
        boost::is_base_of<base, ImplementationClass>::value));
};
Run Code Online (Sandbox Code Playgroud)