我有一个可变参数模板函数,它接受带有可变参数类型的std :: function。我想查找sizeof
所有类型的总std::function
,但我希望将double
和float
类型视为特殊类型,其中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;
}
不喜欢我的模板专业化。
答案 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...>();
}