C++ (Qt)template<class T>T Lerp( const T & a, const T & b, double w );
C++ (Qt)class X{ void method () &; void method () const &; void method () volatile &; void method () const volatile &; void method () &&; void method () const &&; void method () volatile &&; void method () const volatile &&;};
C++ (Qt)class X{ void method () mutable, const &, volatile &&, const volatile; // как-нибудь так // или по-другому};
std::vector<int> v{0,1,2,3,4,5}; for(int n : std::views::all(v) | std::views::take(2) ) { std::cout << n << ' '; }
C++ (Qt) class Type{ // ... iterator begin (); const_iterator begin () const; // ...}; // развернутая рефлексия для Wrapper, код достаточно страшный на вид) class Wrapper{ Type m_type; // например, Wrapper содержит Type по значению // ... template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) volatile & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const volatile & { /*additional code*/; return m_type.begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) volatile && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const volatile && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } // ...};
C++ (Qt) struct Type{ void method () && { ::std::cout << "Hello rvalue method " << ::std::endl; }}; void main (){ Type().method(); // ОК Type value; value.method(); // ERROR ::std::move( value ).method(); // OK}
C++ (Qt) class Type{ // ... iterator begin (); const_iterator begin () const; // ...}; // развернутая рефлексия для Wrapper, код достаточно страшный на вид) class Wrapper{ Type m_type; // например, Wrapper содержит Type по значению // ... template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) & { /*additional code*/; return static_cast< Type & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const & { /*additional code*/; return static_cast< Type const & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) volatile & { /*additional code*/; return static_cast< Type volatile & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const volatile & { /*additional code*/; return static_cast< Type const volatile & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) && { /*additional code*/; return static_cast<Type && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const && { /*additional code*/; return static_cast<Type const && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) volatile && { /*additional code*/; return static_cast<Type volatile && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) const volatile && { /*additional code*/; return static_cast<Type const volatile && >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); } // ...};
class Test {public: Test(): mData(100,100) {} std::vector<int> clear() && { return std::move(mData); }private: std::vector<int> mData;};int main() { Test t; std::vector<int> r = std::move(t).clear(); //move data}
template < typename ... _Arguments, typename = ::std::enable_if_t< подходящий метод для _Type существует > > decltype(auto) begin ( _Arguments && ... arguments ) & { /*additional code*/; return static_cast< Type & >( m_type ).begin( ::std::forward< _Arguments && >( arguments ) ... ); }