[英]Passing templated constexpr to function inferring type of auto object
我正在使用模板元编程制作一个实体组件系统库,以在编译时评估签名位集数据,并允许精确的位集大小,而无需使用#define MAX_COMPONENTS some-number
。 我正在使用Boost Hana,并具有应如下所示的功能:
template <auto T>
static constexpr Bitset signatureBitset = Bitset(
hana::fold(SignatureList[hana::integral_c<std::size_t, signatureID<T>>], 0,
[](auto l, auto r) {
return l | 1 << inferProperty<primitiveBit>(r);
}));
它的作用是为给定签名计算constexpr位集。 签名是ECS组件和标签类型的hana :: tuple_t 。 primitiveBit
返回模板参数类型组件/标签的位偏移量。 由于hana :: fold lambda不提供当前r
类型,因此我不能简单地调用primitiveBit<RType>
(未定义RType)。
最简单的解决方案是编写每个模板“函数”的副本,但将其作为实际的constexpr函数而不是静态constexpr对象,但是我试图避免这样做,因为编写30多个重复函数都可以
template <typename T>
static constexpr auto inferFunctionName(hana::basic_type<T> t) {
return functionName<T>;
}
似乎很愚蠢,会使所有内容难以维护。 上面的代码看起来也非常简单,并且可以使用模板函数(将模板constexpr对象作为模板参数)抽象出来。
这是我目前拥有的:
template <template<typename> typename TReturn, typename T>
constexpr auto inferProperty(hana::basic_type<T> t) {
return TReturn<T>();
}
inferProperty<primitiveBit>(r)
抛出编译错误,指出它与定义的模板签名不匹配。
使用template <template<typename T> typename TReturn, typename T>
由于在lambda中未定义T
不能选择template <template<typename T> typename TReturn, typename T>
。
正如Jack C.在评论中所说,一种简单的解决方案是在lambda中使用decltype(r)
从对象获取类型,而不是通过模板函数来推断类型。
这意味着propertyCheck<typename decltype(r)::type>
有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.