Declarei uma classe de template que recebe um size_t
argumento de template. Aqui está a classe (ou struct neste caso):
typedef unsigned char byte;
template <size_t NumBytes>
struct Field
{
bool is_set = false;
std::array<byte, NumBytes> data;
Field() = default;
Field(byte &&val, bool is_set = false);
Field(std::initializer_list<byte> predef);
};
A ideia é usá-lo para campos de cabeçalho de arquivo (ELF neste caso). Quero poder definir um campo da seguinte maneira:
const Field EI_MAG = {0x7F, 0x45, 0x4c, 0x46};
E fazer com que ele deduza automaticamente o argumento de modelo NumBytes, tal que, neste caso, EI_MAG
seria do tipo const Field<4>
. O compilador reclama muito (claro) e eu eventualmente chego ao ponto de definir um guia de dedução de modelo. Minha melhor (e mais recente) tentativa é a seguinte:
template <class Type, class... Data>
Field(Type, Data...) -> Field<sizeof...(Data)>;
Mas o compilador ainda reclama com o seguinte erro:
error: invalid use of template-name ‘Field’ without an argument list
53 | const Field EI_MAG = {0x7F, 0x45, 0x4c, 0x46};
| ^~~~~
Então como devo fazer isso? É possível? Se não, como std::array faz isso? Estou batendo a cabeça há várias horas e ainda tenho um pouco de dificuldade com a forma como a dedução de modelo e os guias de dedução de modelo funcionam. Qualquer ajuda seria muito apreciada.
OBSERVAÇÃO: Todo o código apresentado está localizado em um .hpp
arquivo e todas as definições de função struct estão localizadas no .cpp
arquivo correspondente, que não é apresentado aqui.
Isso é compilado depois que o guia de dedução é corrigido.
Não precisa
class Type
.