Czy szablon zmiennej można przekazać jako argument szablonu szablonu?

11

Poniższy bezsensowny przykład nie kompiluje się, ale czy istnieje jakiś inny sposób przekazania szablonu zmiennej jako argumentu szablonu szablonu?

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>();
}

Wypróbuj Eksplorator kompilatorów

wypaczony
źródło

Odpowiedzi:

3

Krótka odpowiedź: nie

Długa odpowiedź: tak, możesz użyć jakiejś pośredniej za pomocą szablonu klasy:

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>();
}

Przykład na żywo

Racilla Guillaume
źródło
wydaje się nieco wstecz, że należy użyć struktury z członem statycznym. Czy jest to coś, czego można oczekiwać od przyszłego standardu? Masz pojęcie, dlaczego nie jest to możliwe już dziś?
idclev 463035818,
1
@ previouslyknownas_463035818 Nie sądzę, aby ktokolwiek jeszcze to zaproponował (nigdy nie widziałem tego w gazecie, może tego przegapiłem?) I jest też złożoność. W tej chwili parametrami nietypowymi są wartości pr. Ale co by value<T>to znaczyło? Odniesienie do zmiennej globalnej? Ponadto nie można używać ODR parametru szablonu innego niż typ, ale można to zrobić przy użyciu szablonu globalnego.
Guillaume Racicot
dzięki za podpowiedzi, wciąż korzystam z c ++ 11, więc nie znam się zbytnio na zmiennych szablonach i to jest coś, czego bym się spodziewał po wyjęciu z pudełka
idclev 463035818,