• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

niejednoznaczna przeciążona funkcja z szablonami

Object Storage Arubacloud
0 głosów
238 wizyt
pytanie zadane 10 października 2017 w C i C++ przez Pan Kulomb Pasjonat (18,630 p.)

Witam, jak mogę przerobić którąś z deklaracji, aby zawsze gdy podam NotAlwaysCountable wywoływała się pierwsza funkcja?

template<typename ReturnType, typename Type, typename... Args>
ReturnType average(const NotAlwaysCountable<Type> &value, Args... nextArgs);

template<typename ReturnType, typename Type, typename... Args>
ReturnType average(const Type &value, Args... nextArgs);

 

2 odpowiedzi

+1 głos
odpowiedź 11 października 2017 przez j23 Mędrzec (194,920 p.)
wybrane 12 października 2017 przez Pan Kulomb
 
Najlepsza

Można wykorzystać mechanizm SFINAE:

struct NotAlwaysCountableBase {};

template<typename T>
struct NotAlwaysCountable : public NotAlwaysCountableBase {};


template<typename ReturnType, typename Type, typename... Args>
ReturnType average(const NotAlwaysCountable<Type> &value, Args... nextArgs)  { ... }
 
template<typename ReturnType, typename Type, typename... Args>
typename std::enable_if<!std::is_base_of<NotAlwaysCountableBase, Type>::value, ReturnType>::type
average(const Type &value, Args... nextArgs)  { ... }

 

+1 głos
odpowiedź 10 października 2017 przez criss Mędrzec (172,590 p.)
edycja 11 października 2017 przez criss

Mógłbyś użyć częściowej specjalizacji w taki sposób:

template<typename ReturnType, typename Type, typename... Args>
ReturnType average(const Type &value, Args... nextArgs) { std::cout << "primary\n"; }

template<typename ReturnType, typename Type, typename... Args>
ReturnType average<ReturnType, NotAlwaysCountable<Type>, Args...>(const NotAlwaysCountable<Type> &value,Args... nextArgs) { std::cout << "NotAlwaysCountable<Type>\n"; }

ale standard niestety zabrania częściowej specjalizacji funkcji (tak, kod powyżej nie powinien się skompilować; chociaż msvc to ogarnia o ile dobrze kojarze). Można to jednak łatwo obejść opakowując funkcje w klase, ale wtedy przy każdym wywołaniu jesteś zmuszony podawać parametry szablonu :/ Innej opcji niestety nie widze.
Edit: Wykminiłem troche lepiej i rozszerzam odpowiedź. Zawołanie do metody wyspecjalizownej częściowo klasy opakowuje w szablon funkcji, który już nie potrzebuje specjalizacji:

template<typename ReturnType, typename Type, typename... Args>
struct Utils
{
    static ReturnType average(const Type &value, Args... nextArgs) { std::cout << "primary\n"; }
};

template<typename ReturnType, typename Type, typename... Args>
struct Utils<ReturnType, NotAlwaysCountable<Type>, Args...>
{
    static ReturnType average(const NotAlwaysCountable<Type> &value, Args... nextArgs) { std::cout << "NotAlwaysCountable<Type>\n"; }
};

Poniżej kod dodany przy edicie:

template<typename R, typename ...Args>
R average(Args... args)
{
    return Utils<R, Args...>::average(std::forward<Args>(args)...);
}

live przykład

Podobne pytania

0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 5 czerwca 2019 w C i C++ przez profesorek96 Szeryf (91,420 p.)
0 głosów
1 odpowiedź 335 wizyt
0 głosów
1 odpowiedź 135 wizyt
pytanie zadane 16 maja 2016 w C i C++ przez MeowingtonsPHD Nowicjusz (140 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...