#include template< typename T > struct Witness { }; struct A { template< typename T > A( Witness< T > ) { /* ... */ } }; template< int val > int getX() { return val; } template< int val > int getY( std::integral_constant< int, val > ) { return val; } template< int val > int getZ( std::integral_constant< int, val > singleton ) { return getY( singleton ); } int main( void ) { A a{ Witness< long >() }; // new ctor call syntax needed getX< 1 >(); return getZ( std::integral_constant< int, 5 >() ); }