C++ проверка типа данных
Писав функцию с переменным списком параметров различного типа [ Например : FSum(2, 3.5, 4, "a", 32, string("abc") ) ], которая должна суммировать значение только int типа , наткнулся на проблему с проверкой типа данных. Пробовал использовать typeid но почему-то не всегда корректно работает со string. Можно ли это как-то исправить?
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
template <typename T>
int FSum(T t) {
if (typeid(t) == typeid(int))
return t;
else return 0;
}
template <typename T, typename ... TSet>
int FSum(T t, TSet...ts) {
if (typeid(t) == typeid(int)) {
if (sizeof...(TSet) == 1)
return t;
return t + FSum(ts...);
}
else return FSum(ts...);
}
int main() {
string S("abs");
//cout << "FSum( ) = " << FSum(21.4, 3.4, 40,'d',1.2,100,"ss") << endl; //не компилирует
cout << "FSum( ) = " << FSum(21.4, 3.4, 40,'d',1.2,100) << endl; //компилирует
return 0;
}
Ответы (1 шт):
Автор решения: Georgy Firsov
→ Ссылка
С++17 может так вот:
template <typename T, typename ... TSet>
int FSum(T t, TSet...ts)
{
if constexpr (std::is_same_v<std::decay_t<decltype(t)>, int>)
{
if (sizeof...(TSet) == 0) // Тут всё же 0 наверно?
return t;
return t + FSum(ts...);
}
else
return FSum(ts...);
}
Хотя в том же С++17 можно вот такое провернуть (с fold-expression) в самом начале функции, и тогда не скомпилятся инстанцирования не с интами:
static_assert(
(std::is_same_v<TSet, int> && ...)
"FSum should receive only integers"
);