Wywołanie funkcji dla określonych typów

Wywołanie funkcji dla określonych typów
LI
  • Rejestracja: dni
  • Ostatnio: dni
0

Cześć. Mam funkcję szablonową i chciałbym aby została wywołana wtw, gdy typ wartości value to np.int,double.Czy można tak zrobić, czy trzeba przepisywać dwa razy to samo ze zmienionym tylko typem ?

Kopiuj
//coś takiego
template<>
int (Node<int> || Node <double> )::checkOperator()
{
	int result = VALUE;
	if (value == '+')
		result = PLUS;

	return result;
}
kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

Doprecyzuj co się ma kiedy dziać:

  • Szablon klasy, funkcji?
  • Co się ma dziać dla typu spoza listy?
LI
  • Rejestracja: dni
  • Ostatnio: dni
0

szablon klasy template<typename Type> class Node
Dla int, double ma się wykonywać to co powyżej, a dla reszty ma zwracać 0.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

Czym są VALUE i PLUS?

LI
  • Rejestracja: dni
  • Ostatnio: dni
0

stałe typu int

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

Świetnie. Jakiego są typu? Gdzie są zdefiniowane (w szablonie klasy/poza)?

LI
  • Rejestracja: dni
  • Ostatnio: dni
0

Są poza klasą, ale dlaczego o to pytasz ? Chodzi mi jedynie o to aby dopasować tą funkcję do określonego typu. To wszystko.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

Dlatego pytam, że to ma znaczenie. Ale dobra, jak chcesz się pobawić w zabawę w przekazywanie minimum informacji, to proszę bardzo:

Kopiuj
template <typename T, typename Tuple>
struct has_type;

template <typename T>
struct has_type<T, std::tuple<>> : std::false_type {};

template <typename T, typename U, typename... Ts>
struct has_type<T, std::tuple<U, Ts...>> : has_type<T, std::tuple<Ts...>> {};

template <typename T, typename... Ts>
struct has_type<T, std::tuple<T, Ts...>> : std::true_type {};

template<typename T>
int Node<T>::checkOperator()
{
    if constexpr(has_type<T, std::tuple<int, double>>{}) {
    
        int result = VALUE;
        if (value == '+')
            result = PLUS;
     
        return result;
    } else {
        return {};
    }
}

several
  • Rejestracja: dni
  • Ostatnio: dni
2

C'mon @kq, przecież wiesz o co chodzi :D @LightInWindow możesz to osiągnąc za pomocą specjalizacji, bądź za pomocą SFINAE i szablonom pomocniczym z type_traits Masz przykład tego drugiego, zaadaptuj go na swoje potrzeby.

Kopiuj
const int CONST = 5;
template
<
   typename T,
   typename = typename std::enable_if<std::is_same<T, int>::value || std::is_same<T, double>::value>::type
>
int functionOrMethodIDontCare (T var)
{
    return var + CONST;
}

edit 1 i 2 literówki
edit 3 pomyliły mi się equla_to z is_same

MO
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tam gdzie jest (centy)metro...
0

Oczywiście że można cechami typów. Mam tylko takie przeczucie że dla 2 typów wystarczy zrobić specjalizacje i zabronić ogólnej :-) Jak było by ich więcej, to poszedł bym tropem opisanym przez kolegów ;-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.