Nasıl printf std :: vector <> :: size_type?
std::vectorüye türüne sahiptir size_type. Printf format belirleyicisi nedir?
Bunun size_typeaynı olmadığını unutmayın size_t.
https://en.cppreference.com/w/cpp/container/vector
https://en.cppreference.com/w/cpp/types/size_t
https://en.cppreference.com/w/cpp/io/c/fprintf
Yanıtlar
Printf format belirleyicisi nedir?
Kimse bilmiyor. std::vector<?>::size_typeTam olarak ne olduğu belirtilmemiştir , ancak "işaretsiz tamsayı türü" olmasıdır int C ++ Kapsayıcı Kitaplığı, Genel kapsayıcı gereksinimleri . printfBiçim belirticisi türe bağlı olduğundan , hepsi belirli bir uygulamaya bağlıdır. Bir printfformat tanımlayıcısının olmaması da mümkün olabilir .
Nasıl printf std :: vector <> :: size_type?
Adımlar halinde:
printfTüre bağlı olarak biçimlendirme belirticisi almak için bir kitaplık oluşturun .- Bu türdeki kitaplık şablonu.
std::cout::operator<<Zaten baskı için aşırı yüklenmelerin yaptığı gibi . Sadece:
#include <cstdlib>
#include <string>
#include <cstdio>
#include <vector>
template<typename T> constexpr const char *get_printf_formatting_spec() noexcept;
template<> constexpr const char *get_printf_formatting_spec<std::size_t>() noexcept {
return "zu";
}
template<> constexpr const char *get_printf_formatting_spec<unsigned long long>() noexcept {
return "llu";
}
/// etc.
int main() {
const auto fmt = std::string() +
"%" +
get_printf_formatting_spec<std::vector<int>::size_type>() +
"\n";
std::printf(fmt.c_str(), static_cast<std::vector<int>::size_type>(1));
}
Mütevazı bir pratik hack
Diğer yanıtların da önerdiği gibi, bunu yapmanın zarif ve doğrudan bir yolu yok gibi görünüyor. O zaman ne yapmalı? Daha iyi bir yaklaşımın olmadığı için alçakgönüllü olalım ve temellere geri dönelim:
- Yapabileceğiniz en büyük (boyut açısından) işaretli ve işaretsiz tamsayı türleri için printf biçim belirticilerini bulun.
- Derleme zamanında,
size_typekullanarak vektörün işaretini belirleyinstd::is_signed_t<T>. - Çalışma zamanında, boyut değerinin hedef türüne sığacak kadar küçük olup olmadığını kontrol edin, aksi takdirde yalnızca başarısızlığı bildirin.
- Dökme
size_typeuygun tamsayı türüne. - Artık bir printf çağrısında cast değerini kullanabilirsiniz.
Not - İşaretli / işaretsiz biçim belirleyicileri arasında seçim yapmak için ya biçim dizesini dinamik olarak oluşturmanız ya da iki biçim dizesi arasında seçim yapmanız ya da koşullu derleme kullanmanız gerekir. Bunun yerine, en büyük işaretli türü seçip her zaman çevirebilirsiniz. buna da - son parçaya ihtiyaç duyan en büyük boyutlar için başarısız olma pahasına.