Jedna funkcja przyjmująca jako parametr różne struktury

0

Mam taki fragment kodu jak poniżej. Chciałbym stworzyć jedną funkcję, która przyjmie wektor struktur jako parametr i znajdzie w nim wartość maksymalną dla kierunku x, y, z. Problem polega na tym, że nie wiem jak to uogólnić, aby funkcja setThershold przyjmowała dowolny typ. Myślę, że trzeba byłoby skorzystać z szablonu funkcji. Pytanie tylko jak później odwoływać się do Point3D point i wykonywać na niej operacje.

struct Point3D
{
	int x, y, z;
};

struct Struktura1
{
	Point3D point;
	std::string text1;
};

struct Struktura2
{
	Point3D point;
	int value1;
};

struct Struktura3
{
	Point3D point;
	double value1;
};

class Klasa
{
	std::vector<Struktura1> s1;
	std::vector<Struktura2> s2;
	std::vector<Struktura3> s3;

	void setThreshold(/*przekazanie dowolnego wektora struktur*/)
	{
		for each (object var in collection_to_loop)
		{
			//operacje na polu point
		}
	}
};
0

Troszkę za mało kontekstu, co właściwe chcesz zrobić.
Dla tego przykładu (mam nadzieje, że uproszczonego) można użyć polimorfizmu.

4
    template<typename T>
    void setThreshold(T&& vec)
    {
        for(auto&& elem : vec)
        {
            Point3D const& point = elem.point;
            //operacje na polu point
        }
    }

consty pododawaj/usuwaj wg potrzeb.

Swoją drogą, Struktura 1-3 też mogłyby skorzystać na byciu szablonem.

1

Przykład na polimorfizm:

class ILocatedInSpace
{
public:
    virtual ~ILocatedInSpace() {};

    virtual Point3D location() const;
}

struct Struktura1 : public ILocatedInSpace
{
    Point3D point;
    std::string text1;

    Point3D location() const { return point; }
};
// podobnie pozostałe
...

class Klasa
{
    std::vector<std::shared_ptr<ILocatedInSpace>> objects;
};
0

Hej,
generalnie widzę tu przerost formy nad treścią (czasem ten syndrom występuje u tzw. objektowców). Po pierwsze jeżeli chcesz tworzyć strukturę punktów, to możesz użyć tablicy punktów, możesz użyć zbioru punktów (w C/C++ to chyba unordered structure), możesz użyć słownika (hash map), itd. Możesz też rozważać różne struktury drzewiaste, aby uporządkować jakoś te punkty, to ciut bardziej zaawansowane zagadnienie. Natomiast najszybciej chyba wyszukiwać max po kierunku sortując (merge sort jest dość szybki) albo lepiej jeszcze (jeżeli to możliwe) sprawdzać max po kierunku przy każdej wprowadzanej nowej danej, aby nie liczyć za każdym razem maxa od początku...

1

Tak jak pisał kq, można skorzystać w ładny sposób z szablonów o tak:

template <typename T>
struct Struktura 
{
    Point3D point;
    T value;
};
using Struktura1 = Struktura<std::string>;
// Itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1