I am experimenting with the new features of C++11. In my setup I would really love to use inheriting constructors, but unfortunately no compiler implements those yet. Therefore I am trying to simulate the same behaviour. I can write something like this:
template <class T>
class Wrapper : public T {
public:
template <typename... As>
Wrapper(As && ... as) : T { std::forward<As>(as)... } { }
// ... nice additions to T ...
};
This works... most of the time. Sometimes the code using the Wrapper
class(es) must use SFINAE to detect how such a Wrapper<T>
can be constructed. There is however the following issue: as far as overload resolution is concerned, the constructor of Wrapper<T>
will accept any arguments -- but then compilation fails (and this is not covered by SFINAE) if the type T
cannot be constructed using those.
I was trying to conditionally enable the different instantiations of the constructor template using enable_if
template <typename... As, typename std::enable_if<std::is_constructible<T, As && ...>::value, int>::type = 0>
Wrapper(As && ... as) // ...
which works fine as long as:
- the appropriate constructor of
T
ispublic
T
is not abstract
My question is: how to get rid of the above two constraints?
I tried to overcome the first by checking (using SFINAE and sizeof()
) whether the expression new T(std::declval<As &&>()...)
is well-formed within Wrapper<T>
. But this, of course, does not work, because the only way a derived class can use its base's protected constructor is in the member initialization list.
For the second one, I have no idea whatsoever -- and it is the one I need more, because sometimes it is the Wrapper
which implements the abstract functions of T
, making it a complete type.
I want a solution which:
- is correct according to the standard
- works in any of gcc-4.6.*, gcc-4.7.* or clang-3.*
Thanks!