C++ (Qt)template < typename _Type, int _N >class Point{ _Type m_values[ _N ]; ...};
C++ (Qt) Point< double, 2 > point2d( 1.0, 2.0 );Point< double, 3 > point3d( 1.0, 2.0, 3.0 ); ... Point< double, N > pointNd( 1.0, 2.0, ... , N );
C++ (Qt) Point< double, 2 > point2d( Something( 1.0, 2.0 ) );Point< double, 3 > point3d( Something( 1.0, 2.0, 3.0 ) ); ... Point< double, N > pointNd( Something( 1.0, 2.0, ... , N ) );
C++ (Qt)Point< double, 2 > point2d( 1.0, 2.0 );Point< double, 3 > point3d( 1.0, 2.0, 3.0 );
#include<iostream> template < class Type, int N >struct Point{ template<class ... Args> Point( Args&&... args ) { const Type arr[]={ args... }; enum { SIZE = sizeof(arr)/sizeof(Type) }; static_assert(SIZE<= N, "INVALID_SIZE"); for(size_t n=0;n<SIZE;++n) m_values[n]=arr[n]; for(size_t n=SIZE;n<N;++n) m_values[n]=0; } void View()const { std::cout<<"---BEGIN--------------------------\n"; for(size_t n=0;n<N;++n) std::cout<<n<<") "<<m_values[n]<<'\n'; std::cout<<"---END----------------------------\n"; } Type m_values[N];}; int main(){ int v=10; Point<int,10> p(1,2,3,4,v); p.View(); return 0;}
C++ (Qt) template < typename _Type, unsigned int _N >class Point{...public: Point ( const _Type( &values )[ N ] );...};
C++ (Qt) template < typename _Type, unsigned int _N >class BasicArgs{public: typedef _Type ( Values ) [ N ]; protected: Values m_values; public: inline BasicArgs () {} inline operator const Values & () const { return m_values; }...};
C++ (Qt) template < typename _Type, unsigned int _N >class Args;
C++ (Qt)template < typename _Type >class Args< _Type, 1 > : public BasicArgs< _Type, 1 >{public: inline Args ( const _Type & value = _Type() ) { this->m_values[ 0 ] = value; }};
C++ (Qt) template < typename _Type >class Args< _Type, 2 > : public BasicArgs< _Type, 2 >{public: inline Args ( const _Type & value1 = _Type(), const _Type & value2 = _Type() ) { this->m_values[ 0 ] = value1; this->m_values[ 1 ] = value2; }};
C++ (Qt) typedef Point< double, 3 > Point3d;typedef Vector< double, 3 > Vector3d;typedef Args< double, 3 > Args3d; Point3d p1 = Point3d( Args3d( 1.0, 2.0, 3.0 ) );Point3d p2 = Point3d( Args3d( 4.0, 5.0, 6.0 ) );... Vector3d v1 = Vector3d( Args3d( 1.0, 1.0, 1.0 ) );...
void Foo(int, double, char) { ... }struct Rabbit{ void Foo(int, double, char) { ... } void operator()(int, double, char) { ... }};my::tuple<int,double,char> t(10,10.0,'a');t.transmit(&Foo); //эквивалент Foo(10,10.0,'a'); кортеж просто передаст все свои аргументы получателю...Rabbit rabbit;t.transmit(rabbit, &Rabbit::Foo); //эквивалент rabbit.Foo(10,10.0,'a'); кортеж просто передаст все свои аргументы получателю//здесь rabbit - кому передать//Rabbit::Foo - функция, получает значения кортежа. Отвечает за логику наполнения данными...t.transmit(rabbit); //эквивалент rabbit(10,10.0,'a');//если не указать функцию получения, то кортеж будет считать что rabbit - это функтор//передача через operator()...my::Any args[3]; // аналог boost::any, способен хранить объект любого типаt.transmit(args); //кортеж распознает, что передача осуществляется в "массив", и знает, как это правильно сделать//массив будет заполнен через цикл. Элемент массива обязан суметь принимать типы данных кортежа
C++ (Qt) double coords[3] = { 1.0, 2.0, 3.0 };Point p = Point( coords );
C++ (Qt) my::tuple< double, double, double > t( 1.0, 2.0, 3.0 );Point p;t.transmit( p, &Point::setValues );
C++ (Qt)double coords[3] = { 1.0, 2.0, 3.0 };Point p = Point( coords );
C++ (Qt)typedef double Double3[3];typedef Point< double, 3 > Point3d; int main(int argc, char *argv[]){ ... Point3d p( Double3{ 1.0, 2.0, 3.0 } ); ...}