Isso é possível com templates em C++?

1. Isso é possível com templates em C++?

M.
XProtoman

(usa Fedora)

Enviado em 06/02/2016 - 14:28h

#include <iostream>

template <typename Tipo = int>
struct teste
{
Tipo valor;
};

int main()
{
// Normal
teste <unsigned int> a;
// Isso abaixo é o que quero fazer, é possível em C++?
teste <Tipo = unsigned int> b;
return 0;
}



  


2. Re: Isso é possível com templates em C++?

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/02/2016 - 20:37h

XProtoman escreveu:


// Normal
teste <unsigned int> a;
// Isso abaixo é o que quero fazer, é possível em C++?
teste <Tipo = unsigned int> b;


Não é possível. Mas por que você quer fazer desse modo?


3. Re: Isso é possível com templates em C++?

M.
XProtoman

(usa Fedora)

Enviado em 08/02/2016 - 02:58h

Boa noite paulo1205, tudo bom?

Gostaria que C++ tivesse essa característica para não precisar preencher 4 campos diferentes de um template, apenas o último deles(que não pode infelizmente ser o primeiro nem o segundo e até depende do primeiro), resolvi esse problema criando um macro com #DEFINE(com todos os campos preenchidos, então está solucionado).

Abaixo tem um detalhamento e um código, mas era basicamente isso acima.

Existe uma classe no projeto da biblioteca que acabou fazendo uso de templates, a natureza dessa classe é ter 100% de métodos/funções estáticos e nenhum atributo(a função dela é apenas prover suplementos, não é filha de ninguém, nem ninguém a herda), por estar evitando ao máximo expor/distribuir header de templates então só é feito include no código fonte(nos .cpp's) das classes da biblioteca que fazem uso dela internamente.

C/C++ as vezes tem várias formas de fazer as coisas, isso foi um caminho que tive que seguir, os códigos abaixo são só exemplos de como está implementado(não faz parte do código real), essa templete de classe tem apenas 2 campos contra 4 do meu projeto. O macro que falei no início do texto nada tem haver com o macro(FUNCIONA) que está ai nesse código.


// Salve como CodigoErro.cpp
// Para compilar:
// $ g++ -std=c++14 -pedantic-errors -Wall -Wextra -Werror CodigoErro.cpp -o CodigoErro.run
#include <iostream>

// Comente a linha abaixo para quebrar o código
#define FUNCIONA 1

// Imagine a parte abaixo faz parte de um
// HEADER que é incluído apenas pelo
// código-fonte da biblioteca e o usuário dela
// desconhece a existência desse HEADER
namespace generico
{

#ifdef FUNCIONA
template <typename ValorTipo = unsigned int>
struct ponto
{
ValorTipo x;
ValorTipo y;
};


template <typename ValorTipo = unsigned int, typename PontoTipo = struct ponto <ValorTipo>>
#else
template <typename ValorTipo = unsigned int>
#endif
class Linha
{
public:
typedef ValorTipo valor_tipo;
#ifdef FUNCIONA
typedef PontoTipo ponto_tipo;
#else
typedef struct ponto
{
valor_tipo x;
valor_tipo y;
} ponto_tipo;
#endif
public:
static ponto_tipo pegarPonto()
{
return {0, 1};
}
};

}

// Imagine que a parte abaixo é um HEADER
// que o usuário da biblioteca tem acesso
// e usa normalmente.
namespace referencia
{

class Linha
{
public:
typedef short valor_tipo;
typedef struct ponto
{
valor_tipo x;
valor_tipo y;
} ponto_tipo;
public:
ponto_tipo pegarPonto()
{
#ifdef FUNCIONA
return generico::Linha <valor_tipo, ponto_tipo>::pegarPonto();
#else
return generico::Linha <valor_tipo>::pegarPonto();
#endif
}
};

}

// Main
int main()
{
return 0;
}


Boa noite e bom carnaval para todos!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts