Const/non-const metoda s vyuzitim sablon – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Const/non-const metoda s vyuzitim sablon – C / C++ – Fórum – Programujte.comConst/non-const metoda s vyuzitim sablon – C / C++ – Fórum – Programujte.com

 

Stamp
~ Anonymní uživatel
18 příspěvků
21. 3. 2019   #1
-
0
-

Ahoj, snazim sa vyriesit duplikaciu kodu v const/non-const verzii pri mojej implementacii metody top() v triede stack s vyuzitim sablon, avsak toto sa mi neskompiluje pokial tam nepridam staticauto& _at .. moc nerozumiem preco, nejake vysvetlenie ? dakujem :-)
 

reference top() {
	return _top( *this );
}
const_reference top() const {
	return _top( *this );
}


template < typename Self >
auto& _top( Self& self ){
	if ( self.empty() ) {
		throw std::logic_error::logic_error( "Calling top on empty stack!" );
	}
	return self.m_buffer[ self.m_size - 1 ];
}
Nahlásit jako SPAM
IP: 78.99.79.–
Stamp
~ Anonymní uživatel
18 příspěvků
21. 3. 2019   #2
-
0
-

EDIT: Samozrejme myslim static auto& top

Nahlásit jako SPAM
IP: 78.99.79.–
gna
~ Anonymní uživatel
1864 příspěvků
22. 3. 2019   #3
-
0
-

To je zase bomba.

Když si zbytek domyslím tak, aby to dávalo smysl, tak mě nenapadá, co by se na tom nezkompilovalo. Takže to ukaž celé.

Nahlásit jako SPAM
IP: 213.211.51.–
Stamp
~ Anonymní uživatel
18 příspěvků
22. 3. 2019   #4
-
0
-

 >>> stack.h

#pragma once
#include <iostream>
#include <vector>

template <typename T>
class Stack {
public:
	using value_type 	  = T;
	using reference		  = T & ;
	using const_reference = const T &;

	Stack() = default;
	Stack( std::initializer_list<T> list )
		: m_size( list.size() )
	{
		m_buffer.reserve( m_size );
		for ( auto& item : list ) { m_buffer.push_back( item ); } 
	}

	template <typename Arg>
	Stack( std::size_t count, Arg&& args )
		: m_size( count ) 
	{
		for ( int i = 0; i < count; ++i ) { m_buffer.push_back( std::forward<Arg>( args ) ); }
	}

	Stack( const Stack& ) = default;
	Stack( Stack&& ) = default;
	Stack& operator=( const Stack& ) = default;
	Stack& operator=( Stack&& ) = default;

	template <typename Arg>
	void push( Arg&& args ) {
		++m_size;
		m_buffer.push_back( std::forward<Arg>( args ));
	}

	template <typename Arg> 
	void emplace( Arg&& args ) {
		++m_size;
		m_buffer.emplace_back( std::forward<Arg>( args ) );
	}

	void swap( Stack<T>& other ) {
		using std::swap;
		std::swap( m_buffer, other.m_buffer );
		std::swap( m_size, other.m_size );
	}

	void pop() {
		if ( !empty() ) {
			--m_size;
		}
	}

	reference top()		    { return _top( *this ); }
	const_reference top() const { return _top( *this ); }

	bool empty() const { return m_size == 0; }
	std::size_t size() const { return m_size; }

private:
	std::vector<T> m_buffer;
	std::size_t m_size = 0;

	template < typename Self >
	auto& _top( Self& self ){
		if ( self.empty() ) {
		        throw std::logic_error::logic_error( "Calling top on empty stack!" );
		}
		return self.m_buffer[ self.m_size - 1 ];
	}
};

 >>> main.cpp

#include <iostream>
#include "stack.h"
int main()
{
	const Stack<int> stack2 {2};
	auto y = stack2.top();
}

 Pokial tam nemam static tak v MSVC dostanem nieco taketo:


Error	C2662	'auto &Stack<int>::_top<const Stack<int>>(Self &)': cannot convert 'this' pointer from 'const Stack<int>' to 'Stack<int> &' 57	
Nahlásit jako SPAM
IP: 78.99.79.–
gna
~ Anonymní uživatel
1864 příspěvků
22. 3. 2019   #5
-
0
-

Aha. Takhle v podstatě chceš, aby ti to vygenerovalo: 

& _top(&);
const& _top(const&) const/* <-- */;

Což netuším, jestli vůbec jde.

Takže první nejde použít, protože parametr je const a druhou protože metoda není const.

Když ji uděláš static (nebo const), tak to vygeneruje použitelné metody pro oba případy.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 11 hostů

Podobná vlákna

Metoda const — založil kas

Metoda static a const — založil liamlim

Const — založil sexmachina

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý