2015-02-15 3 views
1

У меня есть функция вариационного шаблона, которая принимает std :: function с вариационными типами. Я хочу найти всего sizeof тех типов, которые std::function имеет, за исключением того, что я хочу обрабатывать double и float типами специальных, где sizeof(double) == 100 и sizeof(float) == 50.Получить пользовательский размер аргумента типа шаблона шаблона std :: function

Вот псевдо-код (не компилируется)

#include <iostream> 
#include <functional> 

// terminating case for T=double 
template<> 
size_t getSize<double>() 
{ 
    return 100; 
} 

// terminating case for T=float 
template<> 
size_t getSize<float>() 
{ 
    return 50; 
} 

// terminating case for T being anything else 
template<class T> 
size_t getSize<T>() 
{ 
    return sizeof(T); 
} 

// recursive case 
template<class T, class ...S> 
size_t getSize<T, ...S>() 
{ 
    return getSize<T>() + getSize<S>(); 
} 

template <class ...T> 
void print_function_arg_custom_size(std::function<void(T...)> f) 
{ 
    size_t totalSize = 0; 
    // get size recursively 
    totalSize = getSize<T>(); 

    std::cout << "totalSize: " << totalSize << std::endl; 
} 

void foo(uint8_t a, uint16_t b, uint32_t c, double d) 
{ 
    // noop 
} 

int main() 
{ 
    std::function<void(uint8_t, uint16_t, uint32_t, double)> f = foo; 
    print_function_arg_custom_size<uint8_t, uint16_t, uint32_t, double>(f); 

    return 0; 
} 

Один из вопросов, которые я имею с этим, что getSize не нравится мой шаблон специализации.

ответ

1

Пара ошибок:

template<class T> 
size_t getSize<T>() 
{ 
    return sizeof(T); 
} 

Вам не нужно предоставлять «список специализации», поскольку она не является специализация. Кроме того, поскольку пакеты параметров могут быть пустыми, компилятор не может выбирать между перегрузками getSize<T> и getSize<T, S...>. Чтобы это исправить, сделать эти изменения:

template <typename T> 
size_t getSize() 
{ 
    return sizeof(T); 
} 

// recursive case 
template<class T, class U, class ...S> 
size_t getSize() 
{ 
    return getSize<T>() + getSize<U, S...>(); 
} 

Live Demo.

+2

более [C++ 14 fashion] (http://melpon.org/wandbox/permlink/Uf0H8rlCRfEcbH1b), или даже в [C++ 1z fashion] (http://melpon.org/wandbox/permlink/hXzQz3VAsRfI2QFW) –

Смежные вопросы