2015-10-30 14 views
6

Non riesco a immaginare perché sia ​​stato scelto che std::bitset::size non sia statico. Rende molto più difficile ottenere una dimensione constexpr; devi scrivere qualcosa del genere:Perché std :: bitset :: size non statico

template<int val> 
struct int_ 
{ 
    static const constexpr value = val; 
}; 

template<size_t size> 
auto getBitsetSizeIMPL(std::bitset<size>) 
{ 
    return int_<size>{}; 
} 

template<typename BitsetType> 
constexpr size_t getBitsetSize() 
{ 
    return decltype(getBitsetSizeIMPL(BitsetType{}))::value; 
} 

Quando se fosse statico tutto quello che avrebbe dovuto fare sarebbe

BitsetType::size() 

e non ci sarebbe alcun sacrificio di funzionalità.

C'è una ragione storica che mi manca o c'è un fatto tecnico che mi manca?

+1

FWIW, si può fare 'BitsetType {} size()'.. – cpplearner

+0

Vero! Non ci ho pensato. Questo è molto meglio. Ma ancora, per qualsiasi motivo non può essere statico? –

+0

Lo stesso motivo per cui 'std :: array :: size' non è statico, immagino. Qualcuno stava chiedendo di quella settimana scorsa. –

risposta

1

L'assunzione di un non constexprstd::bitset::size non è corretto:

std::size_t size() const; // until C++11 
constexpr std::size_t size(); // since C++11, until C++14 
constexpr std::size_t size() const; // since C++14) 
+0

Ma per poterle usare, devi avere un bitset di constexpr. Non è statico –

+0

@RussellGreene: E? –

+0

Non stai rispondendo alla domanda. So che è constexpr. Sono solo curioso di sapere perché hanno scelto quella scelta di design. –