//#pragma once
#include <array>
#include <initializer_list>
#include <algorithm>
template < class T,std:: size_t N>
class ConstexprVector {
std:: array < T, N> Buff{ } ;
std:: size_t C = 0 ;
public :
typedef T ValueType;
typedef typename std:: array < T, N> :: iterator Iterator;
typedef typename std:: array < T, N> :: const_iterator ConstIterator;
constexpr ConstexprVector( ) { } ;
explicit ConstexprVector( const std:: initializer_list < T> & L) {
std:: size_t V = 0 ;
auto it1 = L.begin ( ) ;
auto it2 = Buff.begin ( ) ;
for ( it1 ,it2 ; it1 ! = L.end ( ) && it2 ! = Buff.end ( ) ; it1++ , it2++ ) {
* it2 = * it1;
V++ ;
}
C = V;
}
constexpr std:: size_t Size( ) const {
return C;
}
constexpr std:: size_t MaxSize( ) const {
return N;
}
constexpr bool PushBack( const T& In) {
if ( C >= Buff.size ( ) ) return false ;
Buff[ C] = In;
C++ ;
return true ;
}
/** /
template<class... A>
constexpr bool EmplaceBack(const A& ...In) {
if (C >= Buff.size()) return false;
Buff[C] = T(In...);
C++;
return true;
}
/**/
constexpr bool PopBack( ) {
if ( C == 0 ) return false ;
//Buff[C]~T();
C-- ;
return true ;
}
constexpr bool Clear( ) {
while ( PopBack( ) ) ;
return true ;
}
constexpr Iterator begin( ) {
return Buff.begin ( ) ;
}
constexpr ConstIterator begin( ) const {
return Buff.begin ( ) ;
}
constexpr Iterator end( ) {
return Buff.begin ( ) + C;
}
constexpr ConstIterator end( ) const {
return Buff.begin ( ) + C;
}
} ;
#include <iostream>
#include <cstdint>
//#include "ConstexprVector.h"
typedef ConstexprVector< std:: uint64_t , 128 > DType;
constexpr std:: uint64_t Calc( const DType& D) {
std:: uint64_t C = 0 ;
for ( const DType:: ValueType & o : D) {
C + = o;
}
return C;
}
int main( ) {
//constexpr std::initializer_list<DType::ValueType> L{ 1,2,3,4,5,6,7,8,9 };
constexpr DType D{ } ;
constexpr std:: uint64_t R = Calc( D) ;
std:: cout << R << std:: endl ;
return true ;
}
Ly8jcHJhZ21hIG9uY2UKI2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdGVtcGxhdGU8Y2xhc3MgVCxzdGQ6OnNpemVfdCBOPgpjbGFzcyBDb25zdGV4cHJWZWN0b3IgewoJc3RkOjphcnJheTxULCBOPiBCdWZme307CglzdGQ6OnNpemVfdCBDID0gMDsKcHVibGljOgoKCXR5cGVkZWYgVCBWYWx1ZVR5cGU7Cgl0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6YXJyYXk8VCwgTj46Oml0ZXJhdG9yIEl0ZXJhdG9yOwoJdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmFycmF5PFQsIE4+Ojpjb25zdF9pdGVyYXRvciBDb25zdEl0ZXJhdG9yOwoJY29uc3RleHByIENvbnN0ZXhwclZlY3Rvcigpe307CglleHBsaWNpdCBDb25zdGV4cHJWZWN0b3IoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+JiBMKXsKCQlzdGQ6OnNpemVfdCBWID0gMDsKCQlhdXRvIGl0MSA9IEwuYmVnaW4oKTsKCQlhdXRvIGl0MiA9IEJ1ZmYuYmVnaW4oKTsKCQlmb3IgKGl0MSAsaXQyIDsgaXQxICE9IEwuZW5kKCkgJiYgaXQyICE9IEJ1ZmYuZW5kKCk7IGl0MSsrLCBpdDIrKykgewoJCQkqaXQyID0gKml0MTsKCQkJVisrOwoJCX0KCQlDID0gVjsKCX0KCWNvbnN0ZXhwciBzdGQ6OnNpemVfdCBTaXplKCkgY29uc3R7CgkJcmV0dXJuIEM7Cgl9Cgljb25zdGV4cHIgc3RkOjpzaXplX3QgTWF4U2l6ZSgpIGNvbnN0IHsKCQlyZXR1cm4gTjsKCX0KCWNvbnN0ZXhwciBib29sIFB1c2hCYWNrKGNvbnN0IFQmIEluKSB7CgkJaWYgKEMgPj0gQnVmZi5zaXplKCkpIHJldHVybiBmYWxzZTsKCQlCdWZmW0NdID0gSW47CgkJQysrOwoJCXJldHVybiB0cnVlOwoJfQoJLyoqIC8KCXRlbXBsYXRlPGNsYXNzLi4uIEE+Cgljb25zdGV4cHIgYm9vbCBFbXBsYWNlQmFjayhjb25zdCBBJiAuLi5JbikgewoJCWlmIChDID49IEJ1ZmYuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CgkJQnVmZltDXSA9IFQoSW4uLi4pOwoJCUMrKzsKCQlyZXR1cm4gdHJ1ZTsKCX0KCS8qKi8KCWNvbnN0ZXhwciBib29sIFBvcEJhY2soKSB7CgkJaWYgKEMgPT0gMClyZXR1cm4gZmFsc2U7CgkJLy9CdWZmW0NdflQoKTsKCQlDLS07CgkJcmV0dXJuIHRydWU7Cgl9CgoJY29uc3RleHByIGJvb2wgQ2xlYXIoKSB7CgkJd2hpbGUgKFBvcEJhY2soKSk7CgkJcmV0dXJuIHRydWU7Cgl9CgoJY29uc3RleHByIEl0ZXJhdG9yIGJlZ2luKCkgewoJCXJldHVybiBCdWZmLmJlZ2luKCk7Cgl9CgkKCWNvbnN0ZXhwciBDb25zdEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgewoJCXJldHVybiBCdWZmLmJlZ2luKCk7Cgl9Cgljb25zdGV4cHIgSXRlcmF0b3IgZW5kKCkgewoJCXJldHVybiBCdWZmLmJlZ2luKCkrQzsKCX0KCWNvbnN0ZXhwciBDb25zdEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKCQlyZXR1cm4gQnVmZi5iZWdpbigpK0M7Cgl9Cn07CgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjc3RkaW50PgoKLy8jaW5jbHVkZSAiQ29uc3RleHByVmVjdG9yLmgiCgp0eXBlZGVmIENvbnN0ZXhwclZlY3RvcjxzdGQ6OnVpbnQ2NF90LCAxMjg+IERUeXBlOwoKY29uc3RleHByIHN0ZDo6dWludDY0X3QgQ2FsYyhjb25zdCBEVHlwZSYgRCkgewoJc3RkOjp1aW50NjRfdCBDID0gMDsKCWZvciAoY29uc3QgRFR5cGU6OlZhbHVlVHlwZSYgbyA6IEQpIHsKCQlDICs9IG87Cgl9CgoJcmV0dXJuIEM7Cn0KCmludCBtYWluKCkgewoJLy9jb25zdGV4cHIgc3RkOjppbml0aWFsaXplcl9saXN0PERUeXBlOjpWYWx1ZVR5cGU+IEx7IDEsMiwzLDQsNSw2LDcsOCw5IH07Cgljb25zdGV4cHIgRFR5cGUgRHsgfTsKCWNvbnN0ZXhwciBzdGQ6OnVpbnQ2NF90IFIgPSBDYWxjKEQpOwoKCXN0ZDo6Y291dCA8PCBSIDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gdHJ1ZTsKfQ==
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:92:34: in constexpr expansion of ‘Calc(D)’
prog.cpp:82:35: error: ‘constexpr ConstexprVector<T, N>::ConstIterator ConstexprVector<T, N>::begin() const [with T = long unsigned int; long unsigned int N = 128ul; ConstexprVector<T, N>::ConstIterator = const long unsigned int*]’ called in a constant expression
for (const DType::ValueType& o : D) {
^
prog.cpp:62:26: note: ‘constexpr ConstexprVector<T, N>::ConstIterator ConstexprVector<T, N>::begin() const [with T = long unsigned int; long unsigned int N = 128ul; ConstexprVector<T, N>::ConstIterator = const long unsigned int*]’ is not usable as a constexpr function because:
constexpr ConstIterator begin() const {
^~~~~
prog.cpp:63:21: error: call to non-constexpr function ‘const value_type* std::array<_Tp, _Nm>::begin() const [with _Tp = long unsigned int; long unsigned int _Nm = 128ul; std::array<_Tp, _Nm>::const_iterator = const long unsigned int*; std::array<_Tp, _Nm>::value_type = long unsigned int]’
return Buff.begin();
^
stdout