wartość domyślna template'a

0

Mam klasę, która potrzebuje funkcji porównującej. Przekazuje to jako argument w template.

template <class T, typename F>

T jest typem, który klasa przechowuje, natomiast F jest komparatorem obiektów typu T. Chciałbym w jakiś sposób domyślnie ustawić go na

operator >(const T&, const T&)

próbuje zrobić to w konstruktorze:

klasa (..., F &&_comp = operator >(const T&, const T&)) : ... {}

jednak dostaję syntax error. W jaki sposób to naprawić?

2
template <class T, typename F = greater<T>>
0

No dobra, ale jak chce przechowywać inty, to musze pisać dodatkową funkcję, a niepotrzebnie. Nie da się inaczej?

2

Dlaczego? greater<int> też jest zdefiniowany przecież.

0

No tak, masz rację. A czy jest możliwość ustawienia tego w konstruktorze?

0

http://ideone.com/I4hILX

co popsułem?

0

Żauważ, że nawet gdyby coś takiego przeszło, to przy deklaracji klasy musiałbyś podać 2 parametry szablonu, bo żaden z nich nie ma domyślnego typu. No i na co Ci wtedy domyślny parametr konstruktora, skoro typ tego parametru musisz podać. Czyli powiedzmy coś takiego:

template <typename F, typename T>
class X
{
public:
	X(T&& comparator = greater<F>()) { cout << "Fajnie" << endl; }	
};

int main() 
{
	X<int, greater<int>> x;
	
	return 0;
}
0

Uznałem, że lepiej to robić w templatach, nie w konstruktorze, więc bardziej pomocna będzie odpowiedź na ostatni mój post ; )

1
nieznajomy987 napisał(a):

http://ideone.com/I4hILX
co popsułem?

http://ideone.com/FKN1dt

#include <iostream>
using namespace std;

template <class T, typename comp = greater<T>>
class klasa {
	public:
	klasa(const T &a, const T &b) {
		cout << comp()(a, b);
	}
};

int main() {
	klasa<int> a(1, 2);
	return 0;
}
0

O jezuchryste, dlaczego to takie brzydkie? Sądziłem, że comp będzie funkcją. Czym zatem jest, że trzeba takiego syntax'a używać?

0

Edit: w jaki sposób przekazywać swoje funkcje jako drugi argument templata? Nie przepuszcza wskaźników ani lambd.

1

O jezuchryste, dlaczego to takie brzydkie? Sądziłem, że comp będzie funkcją. Czym zatem jest, że trzeba takiego syntax'a używać?
Bo comp to typ, a nie obiekt typu greater<T>.

Edit: w jaki sposób przekazywać swoje funkcje jako drugi argument templata? Nie przepuszcza wskaźników ani lambd.

struct MyCompare
{
	bool operator()(const int& a, const int& b) { return true; }
};
...
klasa<int, MyCompare> b(5, 2);
0

Dobra, strasznie to brzydkie. Uogólniając - chcę przekazać jako template funkcje porównującą. Żeby łykało wszystko - lambdy, wskaźniki i inne takie. Jak?

0

Nie wiem czy w tym momencie da się mieć domyślny drugi parametr szablonu.

#include <iostream>
using namespace std;

template <class T, typename comp>
struct klasa {
	klasa(const T &a, const T &b, comp C = greater<T>()) 
	{
		cout << C(a, b) << endl;
	}
};

struct MyCompare
{
	bool operator()(const int& a, const int& b) { return true; }
};

bool fPtr(const int& a, const int& b) { return false; }

int main() 
{
	klasa<int, greater<int>> a(1, 2);
	klasa<int, MyCompare> b(5, 2, MyCompare());
	
	auto lessThan = [](const int& a, const int& b) { return a < b; };
	klasa<int, decltype(lessThan)> c(1, 5, lessThan);
	
	klasa<int, decltype(fPtr)> d(0, 0, fPtr);
	
	return 0;
}
0

Sądzisz, że takie rozwiązanie będzie najlepsze?
Poza tym:
http://ideone.com/1Q1TU3
czegoś tu nie rozumiem.

0

http://ideone.com/YzakHW
nie działa już wtedy, kiedy chcę ten komparator sobie przechować.

0

Wybaczcie za tyle postów, ale nie mam innej możliwości.
Mam coś takiego:
http://ideone.com/FqsBhQ
czy to najlepsze rozwiązanie?

0

Zmienna nie może mieć typu funkcyjnego, więc to się wywala dla ostatniej wersji, gdzie przekazywany jest wskaźnik do funkcji.

comp komparator;
...
klasa<int, decltype(fPtr)> d(0, 0, fPtr);

czy to najlepsze rozwiązanie?
Nie wiem czy najlepsze, że sądzę, że nie powinno być

F &&comp;

tylko

F comp;
0

W ogóle się wszędzie wywala. Albo działa dla domyślnego parametru, albo dla całej reszty.
http://ideone.com/exTbMD

0

A gdzie masz konstruktor, który przyjmuje 3 parametry?

0

Racja, zapomniałem wywalić tego (bo i tak nie działa)
http://ideone.com/exTbMD

0

Ja wszystko rozumiem i wiem dlaczego nie działa. Pytanie jak zrobić, żeby działało.

0

Opakować wskaźnik funkcji w std::function

function<bool(const int&, const int&)> f = fPtr;
klasa<int, decltype(f)> d(0, 0, f);

Czy istnieje ładniejszy sposób? Może, ale nie znam.

0

Okej, dzięki wielkie za pomoc ; )

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.