Um modelo de variável pode ser passado como um argumento de modelo?

11

O exemplo sem sentido a seguir não é compilado, mas existe outra maneira de passar um modelo de variável como argumento de modelo?

template<typename T>
constexpr auto zero = T{0};

template<typename T, template<typename> auto VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T> + T{1};
}

int main()
{
    return add_one<int, zero>();
}

Experimente o Compiler Explorer

invexo
fonte

Respostas:

3

Resposta curta: Não.

Resposta longa: Sim, você pode usar alguma indireção através de um modelo de classe:

template<typename T>
constexpr auto zero = T{0};

template<typename T>
struct zero_global {
    static constexpr auto value = zero<T>;
};

template<typename T, template<typename> class VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T>::value + T{1};
}

int main()
{
    return add_one<int, zero_global>();
}

Exemplo ao vivo

Guillaume Racicot
fonte
parece um pouco para trás que é preciso recorrer à estrutura com o membro estático. É algo que se pode esperar que venha com um padrão futuro? Alguma idéia de por que não é possível hoje?
idclev 463035818
11
@ formerlyknownas_463035818 Acho que ninguém propôs ainda (nunca vi no jornal, talvez eu tenha perdido?) E também há uma complexidade. No momento, o parâmetro do modelo não-tipo é um valor pr. Mas o que value<T>isso significaria? Uma referência à variável global? Além disso, você não pode usar o ODR como parâmetro de modelo que não seja do tipo, mas pode usar um modelo global.
Guillaume Racicot
Obrigado pelas dicas, eu ainda estou no c ++ 11, por isso não estou muito familiarizado com modelos de variáveis, e isso é algo que eu teria esperado para trabalhar fora da caixa
idclev 463035818