[type_traits] How can I test if a class has a public constructor?

Hi, I want to prevent non-factory creation of my classes. All classes have constructors without arguments. The constructor of a class should be 'protected' and a special creator template class is used to derive from the class and give the factory access to it. Example: class A : public Base { protected: A(); public: void DoSomething(); }; template < class T > class Creator : public T { public: static Base* Create() { return new Creator<T>; } }; ... class Factory { static A* GetAObject() { return Creator<A>::Create(); } }; The example is somewhat contrived to omit non-essential details. Anyway, what I would like to do is get a compiler error when I register a class with the factory that has a publicly accessible constructor. I tried to do this with boost::has_trivial_constructor< T > like this: class A : public Base { public: A() {} }; template < bool B > class CGiveError { public: static void error() {} }; template <> class CGiveError<true> { public: static void error() { assert( false ); } }; void RegisterAll() { CGiveError< boost::has_trivial_constructor< A >::value
::error(); }
However, this doesn't work. I guess has_trivial_constructor just checks if the constructor takes arguments or not. Is there some way to achieve what I want? That is, issue an error if the constructor is public? Thanks, Steven

Is there some way to achieve what I want? That is, issue an error if the constructor is public?
Sigh... no as far as I know we have no way of checking for accessibility, it's a recurring problem because is_convertible - to pick just one - may produce compiler errors if there is a conversion but it's not public. John.
participants (2)
-
John Maddock
-
Steven van Dijk