#include <tuple>
#include <cstddef>
#include <utility>
#include <iostream>
enum class XParameters : unsigned int
{
PARAMETER1, // int
PARAMETER2, // float
MAX,
} ;
enum class YParameters : unsigned int
{
PARAMETER3 = XParameters:: MAX // std::string
} ;
using XTuple = std:: tuple < int , float > ;
using YAttributes = std:: tuple < std:: string > ;
using YTuple = decltype( tuple_cat( XTuple( ) , YAttributes( ) ) ) ;
template < typename Attributes>
struct Common
{
Common( Attributes&& attr) : attributes( std:: move ( attr) ) { }
Attributes attributes;
template < typename AttributeName>
auto GetAttribute( AttributeName attributeName) - > decltype( std:: declval ( std:: get < static_cast < size_t > ( attributeName) > ( attributes) ) )
{
return std:: get < static_cast < size_t > ( attributeName) > ( attributes) ;
}
} ;
struct X : Common< XTuple>
{
X( ) : Common( std:: make_tuple ( 42 , 3.14f ) ) { }
} ;
struct Y : Common< YTuple>
{
Y( ) : Common( std:: make_tuple ( 666 , 0.01f , "string" ) ) { }
} ;
int main( )
{
X x;
Y y;
int parameter1 = std:: get < static_cast < size_t > ( XParameters:: PARAMETER1 ) > ( x.attributes ) ; // Compiles, works.
std:: cout << parameter1 << std:: endl ;
std:: string parameter3 = std:: get < static_cast < size_t > ( YParameters:: PARAMETER3 ) > ( y.attributes ) ; // Compiles, works.
std:: cout << parameter3 << std:: endl ;
x.GetAttribute ( XParameters:: PARAMETER1 ) ; // Does not compile.
//parameter3 = std::get<static_cast<size_t>(YParameters::PARAMETER3)>(x.attributes); // Does not compile, phew...
return 0 ;
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8Y3N0ZGRlZj4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmVudW0gY2xhc3MgWFBhcmFtZXRlcnMgOiB1bnNpZ25lZCBpbnQKewoJUEFSQU1FVEVSMSwgLy8gaW50CglQQVJBTUVURVIyLCAvLyBmbG9hdAoJTUFYLAp9OwoKZW51bSBjbGFzcyBZUGFyYW1ldGVycyA6IHVuc2lnbmVkIGludAp7CglQQVJBTUVURVIzID0gWFBhcmFtZXRlcnM6Ok1BWCAvLyBzdGQ6OnN0cmluZwp9OwoKdXNpbmcgWFR1cGxlID0gc3RkOjp0dXBsZTxpbnQsIGZsb2F0PjsKdXNpbmcgWUF0dHJpYnV0ZXMgPSBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nPjsKdXNpbmcgWVR1cGxlID0gZGVjbHR5cGUodHVwbGVfY2F0KFhUdXBsZSgpLCBZQXR0cmlidXRlcygpKSk7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQXR0cmlidXRlcz4Kc3RydWN0IENvbW1vbgp7CglDb21tb24oQXR0cmlidXRlcyYmIGF0dHIpIDogYXR0cmlidXRlcyhzdGQ6Om1vdmUoYXR0cikpIHt9CgkKCUF0dHJpYnV0ZXMgYXR0cmlidXRlczsKCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgQXR0cmlidXRlTmFtZT4KICAgIGF1dG8gR2V0QXR0cmlidXRlKEF0dHJpYnV0ZU5hbWUgYXR0cmlidXRlTmFtZSkgLT4gZGVjbHR5cGUoc3RkOjpkZWNsdmFsKHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oYXR0cmlidXRlTmFtZSk+KGF0dHJpYnV0ZXMpKSkKICAgIHsKICAgIAlyZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihhdHRyaWJ1dGVOYW1lKT4oYXR0cmlidXRlcyk7CiAgICB9Cn07CgpzdHJ1Y3QgWCA6IENvbW1vbjxYVHVwbGU+CnsKCVgoKSA6IENvbW1vbihzdGQ6Om1ha2VfdHVwbGUoNDIsIDMuMTRmKSkge30KfTsKCnN0cnVjdCBZIDogQ29tbW9uPFlUdXBsZT4KewoJWSgpIDogQ29tbW9uKHN0ZDo6bWFrZV90dXBsZSg2NjYsIDAuMDFmLCAic3RyaW5nIikpIHt9Cn07CgppbnQgbWFpbigpCnsKCVggeDsKCVkgeTsKCQoJaW50IHBhcmFtZXRlcjEgPSBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KFhQYXJhbWV0ZXJzOjpQQVJBTUVURVIxKT4oeC5hdHRyaWJ1dGVzKTsgLy8gQ29tcGlsZXMsIHdvcmtzLgoJc3RkOjpjb3V0IDw8IHBhcmFtZXRlcjEgPDwgc3RkOjplbmRsOwoKCXN0ZDo6c3RyaW5nIHBhcmFtZXRlcjMgPSBzdGQ6OmdldDxzdGF0aWNfY2FzdDxzaXplX3Q+KFlQYXJhbWV0ZXJzOjpQQVJBTUVURVIzKT4oeS5hdHRyaWJ1dGVzKTsgLy8gQ29tcGlsZXMsIHdvcmtzLgoJc3RkOjpjb3V0IDw8IHBhcmFtZXRlcjMgPDwgc3RkOjplbmRsOwoJCgl4LkdldEF0dHJpYnV0ZShYUGFyYW1ldGVyczo6UEFSQU1FVEVSMSk7IC8vIERvZXMgbm90IGNvbXBpbGUuCgkKCS8vcGFyYW1ldGVyMyA9IHN0ZDo6Z2V0PHN0YXRpY19jYXN0PHNpemVfdD4oWVBhcmFtZXRlcnM6OlBBUkFNRVRFUjMpPih4LmF0dHJpYnV0ZXMpOyAvLyBEb2VzIG5vdCBjb21waWxlLCBwaGV3Li4uCgoJCgkKCQoJcmV0dXJuIDA7Cn0=