Template que chama um construtor ou outro

21 views
Skip to first unread message

Adriano dos Santos Fernandes

unread,
Oct 8, 2021, 7:01:52 AM10/8/21
to Grupo C/C++
Pessoal,

Imagine que tenho algo assim:

-------
template <typename T> class Container
{
public:
void add(int n)
{
T* obj = new T(n);
//T* obj = new T(getPool(), n);
}

void* getPool()
{
return nullptr; // whatever
}
};


class NotPoolable
{
public:
NotPoolable(int n)
{}
};


class Poolable
{
public:
Poolable(void* pool, int n)
{}
};
-------

Quero usar Container com NotPoolable e Poolable. Mas os construtores
delas são diferentes.

Não quero criar uma especialização inteira de Container. Pode ter mais
classes.

Tem como eu escrever Container::add para chamar um ou outro construtor
de T dependendo dele ter ou não o primeiro parâmetro do tipo void*?


Adriano

Emerson de Freitas Barcelos

unread,
Oct 8, 2021, 8:32:02 AM10/8/21
to ccppb...@googlegroups.com
bom dia,

acho q variadic template ou sua emulação para compiladores jurássicos podem ser usados como solução. na std lib o exemplo é o std::make_shared().


Em sex., 8 8e out. 8e 2021 às 8:01, Adriano dos Santos Fernandes
<adri...@gmail.com> escreveu:
--

[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você está recebendo esta mensagem porque se inscreveu no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+unsub...@googlegroups.com.

Wander Lairson Costa

unread,
Oct 8, 2021, 10:27:27 AM10/8/21
to ccppb...@googlegroups.com
class Poolable
{
public:
Poolable(int n, void* pool = nullptr)
{}
};

Isso aqui não serve?

>
> Adriano
>
> --
> http://ccppbrasil.github.io/
> https://twitter.com/ccppbrasil
>
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
> ---
> Você está recebendo esta mensagem porque se inscreveu no grupo "ccppbrasil" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
--
Best Regards,
Wander Lairson Costa

Adriano dos Santos Fernandes

unread,
Oct 8, 2021, 8:08:41 PM10/8/21
to ccppb...@googlegroups.com
On 08/10/2021 11:26, Wander Lairson Costa wrote:
>
> class Poolable
> {
> public:
> Poolable(int n, void* pool = nullptr)
> {}
> };
>
> Isso aqui não serve?
>

Não.

A maioria das classes do projeto são Poolable, e classes externas não.

E o Container teria que funcionar com ambas.


Adriano

Adriano dos Santos Fernandes

unread,
Oct 8, 2021, 8:09:52 PM10/8/21
to ccppb...@googlegroups.com
On 08/10/2021 09:31, 'Emerson de Freitas Barcelos' via ccppbrasil wrote:
> bom dia,
>
> acho q variadic template ou sua emulação para compiladores jurássicos
> podem ser usados como solução. na std lib o exemplo é o std::make_shared().
>

Eu pensei em usar um variadic template pra extrair o primeiro argumento.

Mas o que estou tendo dificuldade é em como usar isso.

Imagino que a solução seria com std::enable_if / SFINAE.


Adriano

walter.ma...@gmail.com

unread,
Oct 8, 2021, 10:37:49 PM10/8/21
to ccppbrasil
Hoje em dia, com concepts e constexpr, diminiu bastante
a necessidade de enable_if e SFINAE (não pensei sobre
o seu problema específico)

       walter.
Reply all
Reply to author
Forward
0 new messages