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

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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.