Digamos que eu tenho uma função de modelo:
template <typename A, typename B>
A fancy_cast(B)
{
return {};
}
O uso pretendido é algo parecido fancy_cast<int>(1.f).
Mas nada impede que o usuário especifique o segundo parâmetro do modelo manualmente:, o fancy_cast<int, int>(1.f)que causaria problemas.
Como impedir que typename Bseja especificado e forçar a dedução?
Eu vim com isso:
// Using this wrapper prevents the code from being
// ill-formed NDR due to [temp.res]/8.3
template <auto V> inline constexpr auto constant_value = V;
template <
typename A,
typename ...Dummy,
typename B,
typename = std::enable_if_t<constant_value<sizeof...(Dummy)> == 0>
>
A fancy_cast(B)
{
return {};
}
Parece funcionar, mas é extremamente complicado. Existe uma maneira melhor?
AeB? Não vejo por que não.