Без дополнительной информации вы не узнаете, что это за базовый тип. Следовательно, приведение void*
к любому типу указателя типа подвержено ошибкам.
Вы можете справиться с ситуацией, используя другую стратегию.
template <typename Iter>
uint64_t do_something(Iter start, Iter end)
{
uint64_t cumulative = 0;
for(auto it = start; it != end; ++it){
cumulative += it->second;
}
return cumulative;
}
void do_something(bool c)
{
uint64_t cumulative = 0;
if(c)
{
cumulative = do_something(data.b.begin(), data.b.end());
}
else
{
cumulative = do_something(data.s.begin(), data.s.end());
}
}
Вы можете использовать std::accumulate
для упрощения первой функции.
template <typename Iter>
uint64_t do_something(Iter start, Iter end)
{
return std::accumulate(start, end, 0);
}