colorname
@colorname

Как правильно написать функцию принимающую универсальную ссылку?

Есть вот такой код где функция word_count принимает ссылку на поток.
Как правильно написать данную функцию чтобы можно было делать вызов как
word_count(ifs), так и вызов word_count(std::ifstream("./main.cpp")) ?
И как изменить код чтобы можно было бы сделать и вызов word_count(ifs) при условии что ifs может быть const?

Вроде как для универсальной ссылки нужно использовать &&, но вместе с этим как я понял нужно использовать и std::forward, но не понимаю куда его вписать корректно если в принципе нужно его прописывать.

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>

template <typename T>
std::size_t word_count(T& is)
{
	return std::distance(std::istream_iterator<std::string>(is), {});
}

int main()
{
	std::ifstream ifs("./main.cpp");
	std::cout << "There are " << word_count(ifs) << " words" << std::endl;

	return 0;
}
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
@res2001
Developer, ex-admin
ifs может быть const

Поток не может быть const. Когда вы читаете/пишете в поток у него меняются внутренние атрибуты. В const потоке вы ничего не сможете изменить, а следовательно ни писать туда ни читать из него не сможете - зачем он такой красивый нужен?
как я понял нужно использовать и std::forward, но не понимаю куда его вписать корректно

Если вы будете поток дальше передавать в какие-то функции, то заверните поток в forward. То же самое, если надумаете возвращать поток из функции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы