Eu tenho uma estrutura de modelo Distance
que usaconstexpr unsigned char mm2cm = 10
Como Distance
é uma classe de modelo, devo definir mm2cm
e Distance
em um arquivo de cabeçalho.
Este arquivo de cabeçalho é incluído nos arquivos cpp.
Quero mm2cm
que ele fique visível apenas neste arquivo de cabeçalho e não nos arquivos cpp que incluem este cabeçalho, ou seja:
Distância.hpp
constexpr unsigned char mm2cm = 10;
template <int offset>
struct Distance{
int mm;
int convToCm() const { return offset + mm2cm * mm; }
};
Principal.cpp
#include "Distance.hpp"
#include <iostream>
int main(){
//I do not want to be able to use mm2mm outside Distance.hpp, as follows
std::cout << (int)mm2cm << std::endl;
}
Uma maneira de resolver isso é usar #define mm2cm 10
and #undef mm2cm
no início e no final do arquivo de cabeçalho (em vez de constexpr unsigned char mm2cm = 10
.
No entanto, muitas pessoas desencorajam o uso de macros por razões. Este post lista algumas razões pelas quais ), e este site afirma que:
Em geral, a palavra-chave const é preferida para definir constantes e deve ser usada em vez de #define.
Outra maneira de resolver isso é criar mm2cmm
um membro estático privado de Distance
.
Entretanto, no problema maior que estou tentando resolver, tenho várias variáveis que quero que fiquem visíveis apenas neste arquivo de cabeçalho, e tornar todas elas membros estáticos privados fará com que minha classe pareça feia (em outras palavras, deve haver uma maneira melhor do que esta solução).
Eu ficaria muito grato se alguém pudesse me fornecer a melhor maneira de garantir mm2cm
que ele seja visível somente para Distance
ou somente dentro deste arquivo de cabeçalho.
Uma edição anterior deste post usava um parâmetro de modelo de tipo. Isso foi alterado para um parâmetro de modelo não-tipo, já que o problema real que estou tentando resolver usa um parâmetro de modelo não-tipo.
Experimente isto:
Distância.hpp
Distância.cpp
Principal.cpp
Analisando suas necessidades, esta é a melhor opção que consegui encontrar...
Ele oculta o valor em uma enumeração e pode ser usado com outras constantes.
convToCm()
parece que está errado (parece que converte cm para mm).Se mm2cm fosse um objeto ou função, então inibiria a capacidade do compilador de otimizar. Poderíamos fazer uma implementação de classe base, mas isso ainda teria os "feios" membros privados/estáticos múltiplos.
O uso do deslocamento inteiro como modelo é estranho para o compilador.
Requer que o compilador gere
Ambos têm código idêntico, exceto pelo parâmetro de modelo 10/12. Isso seria mais problemático se os objetos estivessem em um contêiner, onde
std::vector< Distance<10> >
requer código diferente parastd::vector< Distance<12> >