Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

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