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
épublic
T
não é abstratoMinha 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!