#include <vector>
#include <cstdlib>
#include <cstdarg>
#include <iterator>
#include <iostream>
namespace Interpolation
{
unsigned long DefaultRes = 1 ;
template < class T, unsigned D>
struct Node
{
Node( T const * Data, unsigned long Resolution = DefaultRes) ;
T Data[ D] ;
unsigned long Resolution;
} ;
template < class T, unsigned D>
Node< T, D> MakeNode( T First, ...) ;
}
template < class T, unsigned D>
Interpolation:: Node < T, D> :: Node ( T const * Data, unsigned long Resolution)
: Resolution( Resolution)
{
for ( unsigned i = 0 ; i < D; i++ )
this- > Data[ i] = Data[ i] ;
}
template < class T, unsigned D>
Interpolation:: Node < T, D>
Interpolation:: MakeNode ( T First, ...)
{
T Data[ D] = { First} ;
va_list Args;
va_start ( Args, First) ;
for ( unsigned i = 1 ; i < D; i++ )
Data[ i] = va_arg ( Args, T) ;
va_end ( Args) ;
return Interpolation:: Node < T, D> ( Data) ;
}
int main( )
{
using Interpolation:: MakeNode ;
std:: vector < :: Interpolation :: Node < float , 2 > > Data;
Data.push_back ( MakeNode< float , 2 > ( 5 , 5 ) ) ;
std:: cout << Data.front ( ) .Data [ 0 ] << ' ' << Data.front ( ) .Data [ 1 ] ;
}
static_assert( false ,"show compiler output on ideone" ) ;
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RkYXJnPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxpb3N0cmVhbT4KbmFtZXNwYWNlIEludGVycG9sYXRpb24KewogICAgdW5zaWduZWQgbG9uZyBEZWZhdWx0UmVzID0gMTsKICAgIHRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIEQ+CiAgICBzdHJ1Y3QgTm9kZQogICAgewogICAgICAgIE5vZGUoVCBjb25zdCAqRGF0YSwgdW5zaWduZWQgbG9uZyBSZXNvbHV0aW9uID0gRGVmYXVsdFJlcyk7CiAgICAgICAgVCBEYXRhW0RdOwogICAgICAgIHVuc2lnbmVkIGxvbmcgUmVzb2x1dGlvbjsKICAgIH07CiAgICB0ZW1wbGF0ZTxjbGFzcyBULCB1bnNpZ25lZCBEPgogICAgTm9kZTxULCBEPiBNYWtlTm9kZShUIEZpcnN0LCAuLi4pOwp9CnRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIEQ+CkludGVycG9sYXRpb246Ok5vZGU8VCwgRD46Ok5vZGUoVCBjb25zdCAqRGF0YSwgdW5zaWduZWQgbG9uZyBSZXNvbHV0aW9uKQo6IFJlc29sdXRpb24oUmVzb2x1dGlvbikKewogICAgZm9yKHVuc2lnbmVkIGkgPSAwOyBpIDwgRDsgaSsrKQogICAgICAgIHRoaXMtPkRhdGFbaV0gPSBEYXRhW2ldOwp9CnRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIEQ+CkludGVycG9sYXRpb246Ok5vZGU8VCwgRD4KSW50ZXJwb2xhdGlvbjo6TWFrZU5vZGUoVCBGaXJzdCwgLi4uKQp7CiAgICBUIERhdGFbRF0gPSB7Rmlyc3R9OwogICAgdmFfbGlzdCBBcmdzOwogICAgdmFfc3RhcnQoQXJncywgRmlyc3QpOwogICAgZm9yKHVuc2lnbmVkIGkgPSAxOyBpIDwgRDsgaSsrKQogICAgICAgIERhdGFbaV0gPSB2YV9hcmcoQXJncywgVCk7CiAgICB2YV9lbmQoQXJncyk7CiAgICByZXR1cm4gSW50ZXJwb2xhdGlvbjo6Tm9kZTxULCBEPihEYXRhKTsKfQppbnQgbWFpbigpCnsKICAgIHVzaW5nIEludGVycG9sYXRpb246Ok1ha2VOb2RlOwogICAgc3RkOjp2ZWN0b3I8IDo6SW50ZXJwb2xhdGlvbjo6Tm9kZTxmbG9hdCwgMj4gPiBEYXRhOwogICAgRGF0YS5wdXNoX2JhY2soTWFrZU5vZGU8ZmxvYXQsIDI+KDUsIDUpKTsKICAgIHN0ZDo6Y291dCA8PCBEYXRhLmZyb250KCkuRGF0YVswXSA8PCAnICcgPDwgRGF0YS5mcm9udCgpLkRhdGFbMV07Cn0Kc3RhdGljX2Fzc2VydChmYWxzZSwic2hvdyBjb21waWxlciBvdXRwdXQgb24gaWRlb25lIik7Cg==
compilation info
prog.cpp:45:1: error: static assertion failed: show compiler output on ideone
prog.cpp: In function ‘Interpolation::Node<T, D> Interpolation::MakeNode(T, ...) [with T = float; unsigned int D = 2u]’:
prog.cpp:34:9: warning: ‘float’ is promoted to ‘double’ when passed through ‘...’ [enabled by default]
prog.cpp:34:9: note: (so you should pass ‘double’ not ‘float’ to ‘va_arg’)
prog.cpp:34:9: note: if this code is reached, the program will abort
stdout