2009/4/25 Siegfried Kettlitz <siegfried.kettlitz@googlemail.com>
Hello,
what i like to do, is to detect the presence of a particular type of
constructor for a class in a template. It is possible to use template
overloading to detect the presence of members or member functions
(like with::some_func(int) ), but since it is not possible(?) to take
a pointer to a constructor ( like with::with(int) ), this method does
not work to detect the present types of the templated class T.
Consider this pseudocode:
struct with {
with( int );
}
struct without {
without( void );
}
template<typename T>
T* do_construct() {
a) return new T(int) if T::T(int) present;
b) return new T() if T::T(int) not present;
}
int main( void ) {
do_construct<with>();
do_construct<without>();
}
So far i did not find anything useful in type_traits to make the
do_construct-function work without modifying the classes (adding
inheritance or some static member). Does anyone know another
possibility to do this, or is it not possible using the current
standard of c++?
It's possible, because constructor of 'with' is not explicit.
#include <boost/type_traits/is_convertible.hpp>
struct with {
with(int) {}
};
struct without {
without() {}
};
template <class T>
T* construct(boost::mpl::true_) {
return new T(42);
}
template <class T>
T* construct(boost::mpl::false_) {
return new T();
}
template<typename T>
T* do_construct() {
return construct<T>(boost::is_convertible<int, T>());
}
int main() {
do_construct<with>();
do_construct<without>();
}
I don't know how to solve this problem if constructor was explicit.
Roman Perepelitsa.