Czy da się w jakiś sposób określić zasięg parametru w szablonie?

0

Cześć,
Próbuję napisać swój własny szablon działający na zasadzie std::strchr(), bo dość dużo tej funkcji używam, a pochodzi z C, więc pewnie nie jest mile widziana w nowoczesnym C++.
Chcę przekazywać tylko dwa argumenty do swojej funkcji: dane do przeszukania i szukany znak:

template <class T, class X >
constexpr bool look_for(T set, X sought) {
	for (int it = 0; it != sizeof(set); ++it) {
		if (set[it] == sought)
			return true;
	}
	return false;
}

Oczywiście na razie działa to tylko dla c-stringów, bo dla std::string będzie out of range error. Chciałbym jednak zmienić tę implementację na coś bezpieczniejszego, np. zrobić range-based fora. Tylko mam problem z robieniem zasięgu, bo chyba się nie da tego zrobić z jednej zmiennej set? np. std::begin(set), std::end(set), a z resztą nie wiem czy zasięg by działał dla const char*. Użycie wyglądałoby przykładowo tak:

if (look_for("abcd", 'a'))
   //...

Oczywiście nie byłoby problemu gdybym to napisał jakoś pod std::string, ale nie uważam, że tworzenie obiektu dla tak małej funkcji jest opłacalne. A gdyby użyć jakichś smart-pointerów? Podpowiecie jak by to lepiej napisać?
Pozdro :P

4

Ale co ty chcesz osiągnąć?
Coś mi się wydaje, że chyba nie wiesz że to jest już zrobione!

constexpr auto s1 = "ala ma kota"sv;
constexpr auto npos = std::string_view::npos;
static_assert(s1.find('o') != npos, "There is 'o'");
static_assert(s1.find('y') == npos, "There is no 'y'");

https://wandbox.org/permlink/Sl0ocxTfiPMFkpPG

0

tak wiem, że jest dużo możliwości, ale stl'owe algorytmy są dla std::stringa. A ja nie chcę tworzyć nowego obiektu:

if (look_for("abcd", 'a'))

w tym warunku abcd jest wpisane z klawiatury, a nie przekazany string. Co chcę osiągnąć? std::strchr() w c++'owym wydaniu, dlatego tak kombinuję.

2

Przyjmij const referencję, a nie kopię.

0

Przecież rozwiązanie @MarekR22 operuje na std::string_view, więc żaden obiekt nie jest tworzony.

0

dzięki @kq !

template <class T, class X >
constexpr bool look_for(const T & set, X sought) {
	for (const auto & it : set) {
		if (it == sought)
			return true;
	}
	return false;
}

teraz to już jakoś ładniej wygląda i działa za równo dla cstringów jak i std::stringów :)

1
MarekR22 napisał(a):

Ale co ty chcesz osiągnąć?

Nie odpowiedziałeś co chcesz osiągnąć.

Ja zrozumiałem tak:

  • ma być constexpr
  • ma przetrać dowolny napis
  • ma wyszukiwać (sprawdzić czy jest) literę w napisie

To wszystko std::string_view (std::basic_string_view<T>) załatwia w prosty eleganci i standardowy sposób.

Zupełnie nie rozumiem, po co ci do tego jakakolwiek znajomość zasięgu.

1
Cyberah skomentował(a):

sorry, że nie umiem inaczej. Skoro std::string_view jest taki dobry, to spróbuję go jakoś wykorzystać. STL jest taki wielki, że każde moje rozwiązanie na x linijek ktoś lepszy rozwiązuje jedną

Standardowa biblioteka C++ jest wyjątkowo uboga w porównaniu do konkurencji (Java, C#, python, ...).

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