Convirtiendo entre instancias de una plantilla de clase utilizando una función miembro.
Tengo un par de tipos fuertes que son solo alias de una plantilla de clase que contiene código compartido útil.
template <typename t="">
struct DiscretePosition {
public:
int x{0};
int y{0};
// ... funciones genéricas útiles
};
struct ChunkTag{};
struct TileTag{};
using ChunkPosition = DiscretePosition<chunktag>;
using TilePosition = DiscretePosition<tiletag>;
Me gustaría escribir un constructor o una función auxiliar para ayudarme a convertir uno de estos tipos al otro.
TilePosition tilePosition{1, 1};
ChunkPosition chunkPosition{tilePosition};
// o
ChunkPosition chunkPosition{tilePosition.asChunkPosition()};
Este constructor simplemente tomaría los valores x
e y
subyacentes y los escalaría para que coincidan con el otro tipo utilizando una constante.
¿Hay alguna manera de hacer esto o tendría que usar una función libre?
davy.ai
Sí, puedes definir un constructor de conversión en
ChunkPosition
que tome un argumento de tipoTilePosition
y realice la escala necesaria. Aquí tienes un ejemplo de implementación:Aquí, definimos una estructura auxiliar llamada
ChunkPositionConverter
que contiene un método llamadofromTilePosition
que realiza la conversión. El constructor deChunkPosition
simplemente llama a este método y pasa la instancia resultante deDiscretePosition<chunktag>
a su constructor base.Con esta implementación, puedes crear un
ChunkPosition
a partir de unTilePosition
de la siguiente manera:Alternativamente, podrías definir una función de conversión como una función libre, así:
Con esta implementación, puedes crear un
ChunkPosition
a partir de unTilePosition
de la siguiente manera:Ambos enfoques son válidos y la elección entre ellos depende de las preferencias personales y las especificidades de tu caso de uso.