假设我有这个构造在编译时计算sizeof
个东西
template<typename T>
struct GetTypeSize
{
enum { value = sizeof(T) };
};
// treat float as special
template<>
struct GetTypeSize<float>
{
enum { value = SIZEOF_FLOAT };
};
template<typename...>
struct GetSize
{
enum { value = 0 };
};
template<typename Head, typename... Tail>
struct GetSize<Head, Tail...>
{
enum { value = GetTypeSize<Head>::value + GetSize<Tail...>::value };
};
使用哪个
template <class ...T>
void foo(T... arg)
{
const size_t size = GetSize<T...>::value;
std::cout << "size of the thing is: " << size << std::endl;
// do stuff with arg
}
这很好(显然有原始数据类型)。
现在,我希望它能够处理std::vector<T>
,以便返回vec.size() * sizeof(T)
。显然,这将是一个运行时操作。
我可以轻松改变整个事情。如果我想这样做,我首先不会问这个问题。
我也可以在单独的语句中使用两个构造,一个编译时和另一个运行时,后者在除std::vector<T>
之外的所有内容上都返回0。这样的解决方案并不比让整个事情都是运行时更好,因为你必须为每个arg
进行函数调用,这会使编译时解决方案的整个过程失败。
我真正想要的是尽可能保持编译时间,即在运行时只评估std::vector
。例如,arg = {uint32_t, uint64_t, uint16_t, std::vector<uint32_t>, uint16_t}
生成的代码类似于
const size_t size = 4 + 8 + 2 + (argN.size() * 4) + 2;
所以我想知道在单个构造中是否可以混合编译时和运行时以及如何存档它。