获取std :: function的可变参数模板参数类型的自定义sizeof

时间:2015-02-15 22:52:43

标签: c++ templates c++11 variadic-templates std-function

我有一个可变参数模板函数,它接受带有可变参数类型的std :: function。我想查找sizeof所有类型的总std::function,但我希望将doublefloat类型视为特殊类型,其中sizeof(double) == 100和{ {1}}。

这是伪代码(不编译)

sizeof(float) == 50

我遇到的一个问题是#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; } 不喜欢我的模板专业化。

1 个答案:

答案 0 :(得分:1)

一些错误:

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

您不需要提供&#34;专业化列表&#34;因为它不是专业化的。此外,由于参数包可以为空,因此编译器无法在重载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