Tentei fazer uma função que verifica se o argumento corresponde a valores específicos.
Acho que sei como fazer isso com recursão ou std::initializer_list, mas quero fazer isso com fold. Aqui está o código que não funciona:
template<typename T, T ...ts>
constexpr bool is_in(T value){
return (ts == value) || ... || (false);
}
int main(){
if constexpr(is_in<int, 1, 2, 3>(1))
return 10;
}
Também gostaria de me livrar da especificação do tipo, se possível (por exemplo, o <int>
)
Quer solução em C++ 17, mas C++ 20 também seria interessante de ver.
As expressões de dobra devem ser colocadas entre
(...)
:return ((ts == value) || ... || (false));
.Além disso, você pode descartar
|| false
, está implícito para||
dobras.Você pode fazer isso substituindo
<typename T, T ...ts>
por, por exemplo<auto ...ts, typename T>
.Mas se eu fosse você, passaria todas as alternativas como parâmetros de função (para permitir que fossem alteradas em tempo de execução).
Você só precisa colocar toda a expressão entre parênteses, conforme mostrado abaixo:
Demonstração de trabalho
Sim, você também pode usar o tipo de espaço reservado
auto
para fazê-lo funcionar sem especificar explicitamente,int
substituindo<typename T, T ...ts>
por<auto ...ts, typename T>
Por sugestão do @HolyBlackCat, aqui está a versão com parâmetros da própria função. Parece muito claro e elimina a especificação do arquivo
<T>
.