@krot0glot

Как создать шаблон структуры, которая будет принимать базовые типы данных и класс vector?

Задания из книги.
645bae00ee5c4635942731.png
Текущий код:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

template <class T> struct S
{
	S(const T & val) : val_(val) {}
	// Как объединить функции вывода в одну?
	void PrintVal() const
	{
		cout << val_ << endl;
	}
	void PrintVector() const
	{
		for (size_t i = NULL; i < val_.size(); ++i)
		{
			cout << val_[i] << ' ';
		}
		cout << endl;
	}

	const T & GetVal() const { return val_; }
	const T & GetVector() const { return val_; }
	// Что необходимо написать, чтобы заменить слово "auto"?
	auto & GetVector(const size_t & i) const { return val_[i]; }

private:
	T val_;
};

int main()
{
	vector<int> vv(2, 2);

	S<int> s1(1);
	S<vector<int>> s2(vv);

	s1.PrintVal();
	s2.PrintVector();

	cout << s1.GetVal() << endl;
	cout << s2.GetVector(1) << endl;
	// Как сделать реальной такую запись?
	//cout << s2;
}


Также буду рад, если приведёте свои способы реализации данных заданий.
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
Можно использовать перегрузку оператора <<
Можно использовать новомодный std::input_or_output_iterator или if constexpr
или вовсе явно специализировать/перегрузить шаблон для нужного вам типа.

Вот один из простейших вариантов. Просто добавьте перед функцией main.
template <typename T>
std::ostream& operator<<(std::ostream &os, const S<T>& s)
{
    if constexpr (std::ranges::range<T>) {
        const auto& val = s.GetVal();
        for (const auto& i : s.GetVal()) {
            os << i << " ";
        }
    } else {
        os << s.GetVal();
    }
    return os;
}


Все ещё не универсально, поскольку работает не со всеми контейнерами, а только с теми, которые хранят значения и могут в range_base loop

В таком случае вам больше не нужны функции (если они использовались лишь для вывода информации в консоль)

PrintVal
PrintVector
GetVector

Можно даже избавиться от GetVal, если вам не нужен этот геттер в остальном коде, тогда нужно просто подружить функцию с классом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы