实现一个单独的包装器类,它也验证单例构造函数是私有的'

时间:2015-02-05 13:41:46

标签: c++ templates singleton crtp enable-if

我创建了一个单独的包装器模板类,它提供了instance()成员函数,并且还应该断言单例类是否具有private构造函数。定义如下:

template <
    class T,
    class = typename std::enable_if<!std::is_constructible<T>::value, void>::type
>
class singleton {
public:
    static T& instance() {
        static T inst;
        return inst;
    }
};

当我定义一个单独的类时:

class class_with_public_constr
 : public singleton<class_with_public_constr> {
public:
    class_with_public_constr() {}
    friend class singleton<class_with_public_constr>;
};

代码传递enable_if断言。我的singleton课程模板出了什么问题?

Coliru

1 个答案:

答案 0 :(得分:3)

您可以按照以下方式简化代码,并在构造函数为public时(即不是privateprotected

时打印错误
template<typename T>
class singleton
{
public:
    // Below constructor is always invoked, because the wannabe singleton class will derive this class
    singleton () {
        static_assert(!std::is_constructible<T>::value, "the constructor is public");
    }

    static T& instance();
};

客户端类如下所示:

class A : public singleton<A> 
{
  friend class singleton<A>;   
//public:  // <---------- make it `public` & you get the error!
  A() {}
};

这是demo