Como escolher o tipo de argumento de uma função membro do modelo de classe dependendo do valor do parâmetro do modelo de classe?
Aqui está um exemplo:
#include <memory>
template <class T, bool plainPointer=true>
class C
{
// pseudocode below
void f(plainPointer ? T * x : std::shared_ptr<T> x) { /*implementation*/ }
};
Ou seja, se plainPointer==true
, a seguinte função membro da classe deve ser definida:
void f(T * x) { /*implementation*/ }
caso contrário, esta função membro deverá ser definida:
void f(std::shared_ptr<T> x) { /*implementation*/ }
Eu gostaria de ter uma única implementação para ambas as funções , e apenas o tipo de argumento f
deveria ser plainPointer
dependente.
Você pode usar
std::conditional_t
para fazer a escolha entre 2 tipos:Observe que para que essa abordagem funcione, ambas as opções dentro de
conditional_t
devem estar bem formadas para todas as instanciações.Se você planeja usar esse tipo de argumento de função várias vezes na classe, poderá criar um alias de tipo que poderá reutilizar: