Detectando Construtores Protegidos da Classe Base (possivelmente abstrata)

Eu estou experimentando com os novos recursos do C ++ 11. Na minha configuração eu realmente adoraria usar construtores herdados, mas infelizmente nenhum compilador implementa esses ainda. Portanto, estou tentando simular o mesmo comportamento. Eu posso escrever algo assim:

template <class T>
class Wrapper : public T {
    public:
    template <typename... As>
    Wrapper(As && ... as) : T { std::forward<As>(as)... } { }
    // ... nice additions to T ...
};

Isso funciona ... na maioria das vezes. Às vezes o código usando oWrapper classe (s) deve usar SFINAE para detectar como talWrapper<T> pode ser construído. No entanto, há o seguinte problema: no que diz respeito à resolução de sobrecarga, o construtor deWrapper<T> aceitará quaisquer argumentos - mas a compilação falha (e isso énão coberto pelo SFINAE) se o tipoT não pode ser construído usando aqueles.

Eu estava tentando habilitar condicionalmente as diferentes instanciações do modelo de construtor usandoenable_if

    template <typename... As, typename std::enable_if<std::is_constructible<T, As && ...>::value, int>::type = 0>
    Wrapper(As && ... as) // ...

que funciona bem contanto que:

o construtor apropriado deT épublicT não é abstrato

Minha pergunta é: como se livrar das duas restrições acima?

Eu tentei superar o primeiro verificando (usando SFINAE esizeof()) se a expressãonew T(std::declval<As &&>()...) é bem formadodentro Wrapper<T>. Mas isso, é claro, não funciona, porque a única maneira que uma classe derivada pode usar o construtor protegido de sua base está na lista de inicialização de membros.

Para o segundo, eu não faço ideia - e é o que eu preciso mais, porque às vezes é oWrapper que implementa as funções abstratas deT, tornando-se um tipo completo.

Eu quero uma solução que:

está correto de acordo com o padrãofunciona em qualquer um dos gcc-4.6. *, gcc-4.7. * ou clang-3. *

Obrigado!

questionAnswers(1)

yourAnswerToTheQuestion