在 constexpr 中传递参数包
Passing parameter pack in constexpr
我试图在编译时确定所有传递的对象的大小,然后在超过最大大小时通过 static_assert 中止构建过程。
#include <iostream>
template<class T>
class Test
{
public:
T value;
constexpr size_t size() const { return sizeof(T) + 3; }
};
template<typename ...T>
constexpr int calc(const T&...args)
{
return (args.size() + ...);
}
template<typename ...T>
void wrapper(const T& ...args)
{
// error: 'args#0' is not a constant expression
constexpr int v = calc(args...);
static_assert(v <= 11, "oops");
}
int main()
{
Test<int> a;
Test<char> b;
// a.size() + b.size() == 11
// works
constexpr int v = calc(a, b);
static_assert(v <= 11, "oops");
// wrapper function
wrapper(a, b);
}
如果我直接用对象调用计算函数,效果会很好。
但是如果我使用包装函数并传递参数包,突然间参数似乎不再是常量了。有谁知道我该如何解决这个问题?
函数参数不是 constexpr
表达式(有充分的理由),即使是 constexpr
或 consteval
函数的一部分。
如果您愿意Test::size
静态化,独立于对象:
#include <iostream>
template<class T>
class Test
{
public:
T value;
constexpr static size_t size() { return sizeof(T) + 3; }
};
template<typename ...T>
constexpr size_t calc_types()
{
return (T::size() + ...);
}
template<typename ...T>
constexpr size_t calc_vals(const T&...)
{
return calc_types<T...>();
}
template<typename ...T>
constexpr void wrapper_types()
{
static_assert(calc_types<T...>() <= 11, "oops");
}
template<typename ...T>
constexpr void wrapper_vals(const T&...)
{
wrapper_types<T...>();
}
int main()
{
Test<int> a;
Test<char> b;
// a.size() + b.size() == 11
// works
constexpr int v = calc_vals(a, b);
static_assert(v <= 11, "oops");
// wrapper function
wrapper_vals(a, b);
}
我试图在编译时确定所有传递的对象的大小,然后在超过最大大小时通过 static_assert 中止构建过程。
#include <iostream>
template<class T>
class Test
{
public:
T value;
constexpr size_t size() const { return sizeof(T) + 3; }
};
template<typename ...T>
constexpr int calc(const T&...args)
{
return (args.size() + ...);
}
template<typename ...T>
void wrapper(const T& ...args)
{
// error: 'args#0' is not a constant expression
constexpr int v = calc(args...);
static_assert(v <= 11, "oops");
}
int main()
{
Test<int> a;
Test<char> b;
// a.size() + b.size() == 11
// works
constexpr int v = calc(a, b);
static_assert(v <= 11, "oops");
// wrapper function
wrapper(a, b);
}
如果我直接用对象调用计算函数,效果会很好。 但是如果我使用包装函数并传递参数包,突然间参数似乎不再是常量了。有谁知道我该如何解决这个问题?
函数参数不是 constexpr
表达式(有充分的理由),即使是 constexpr
或 consteval
函数的一部分。
如果您愿意Test::size
静态化,独立于对象:
#include <iostream>
template<class T>
class Test
{
public:
T value;
constexpr static size_t size() { return sizeof(T) + 3; }
};
template<typename ...T>
constexpr size_t calc_types()
{
return (T::size() + ...);
}
template<typename ...T>
constexpr size_t calc_vals(const T&...)
{
return calc_types<T...>();
}
template<typename ...T>
constexpr void wrapper_types()
{
static_assert(calc_types<T...>() <= 11, "oops");
}
template<typename ...T>
constexpr void wrapper_vals(const T&...)
{
wrapper_types<T...>();
}
int main()
{
Test<int> a;
Test<char> b;
// a.size() + b.size() == 11
// works
constexpr int v = calc_vals(a, b);
static_assert(v <= 11, "oops");
// wrapper function
wrapper_vals(a, b);
}