Czy istnieje sposób, aby kompilator wydedukował parametr size_t L za pomocą argumentu szablonu Concepts Concepts?

To najlepsze, co mam

template <typename T, size_t L>
concept def_bitset = std::is_same<T, std::bitset<L>>::value;

template<size_t L>
void stamp(def_bitset<L> auto const &b) {
    std::cout << b << std::endl;
}

Działa to, jeśli zadzwonię do tego, że przekazuje L jako argument szablonu

stamp<4>(bitset<4>{0b0110});

Chciałbym być w stanie zadzwonić do pieczęci bez powtarzania rozmiaru bitów.

6
Julio Rodrigues 15 październik 2020, 14:50

1 odpowiedź

Najlepsza odpowiedź

Koncepcje istnieją, aby sprawdzić ograniczenia na argumentach szablonów. Koncepcja nie jest typem, pomimo pojawiania się w tej samej lokalizacji, co typu puszka przy wykorzystaniu notacji twister. Nie nosi żadnych informacji, które mogą być używane do odliczenia argumentu szablonu.

Aby go zilustrować, przepisaćmy definicję szablonu funkcji tersji do jego wyraźnej formy

template<size_t L, def_bitset<L> T>
void stamp(T const &b) {
    std::cout << b << std::endl;
}

Ta równoważna forma powinna zilustrować problem. Koncepcja może sprawdzić tylko ograniczenie posiadania po T i L zostały wydane. Ale while T jest wystarczająco łatwy, aby wywnioskować, ta definicja szablonu funkcji nie jest zapisywana w sposób, który umożliwia dedukkowanie L z b. Dlatego napotkałeś konieczność wyraźnego określenia L. Koncepcja nie ma pomocy, ponieważ nie jest częścią argumentu funkcji, jest częścią samego szablonu.

Teraz tak się zdarza, że przypadek użycia w pytaniu nie wymaga wcale koncepcji.

template<size_t L>
void stamp(std::bitset<L> const &b) {
    std::cout << b << std::endl;
}

Jest to szablon funkcji, który oczekuje, że specjalizacje std::bitset.

5
StoryTeller - Unslander Monica 15 październik 2020, 12:30