通过宏创建模板专业化
Creating template specializations via a macro
我正在尝试创建一个助手方法createTypedArray
,它"知道"每个元素要分配多少字节。即createTypedArray<Float32Array>(size)
而不是createTypedArray<Float32Array, 4>(size)
。
这是我想出的最好的方法。有更好的方法吗?至少有一个我不喜欢的伪主模板。
#define TYPED_ARRAY_P(T, bytesPerElement)
template <>
Local<T> createTypedArray<T>(size_t size) {
size_t byteLength = size * bytesPerElement;
Local<ArrayBuffer> buffer = ArrayBuffer::New(Isolate::GetCurrent(), byteLength);
Local<T> result = T::New(buffer, 0, size);
return result;
}
// Dummy
template <typename T>
Local<T> createTypedArray(size_t s) {
return void;
}
TYPED_ARRAY_P(Uint8Array, 1);
TYPED_ARRAY_P(Uint16Array, 2);
TYPED_ARRAY_P(Uint32Array, 4);
#undef TYPED_ARRAY_P
通常您希望使用sizeof(ElementType)
,例如:
auto buffer = AllocateSomeBuffer(numberOfElements * sizeof(ElementType));
不过,您不是直接使用ElementType
,而是使用数组类型的一些表示。不用担心,我们只需要从您的T
中取出ElementType
。
遗憾的是,这些类似乎没有T::value_type
或T::element_size
之类的东西。然而,我们仍然希望T
和它的元素大小之间有一个"有保证"的映射,而不是每次都提取一些神奇的常数。
解决这类问题的通常方法是"类型特征"。这些类专门化为我们提供了一些关于类型的计算信息。在我们的案例中,我们想要这样的东西:
template <typename T>
struct V8TypeTraits; // no generic case (e.g. can't ask for V8 traits about int)
template <>
struct V8TypeTraits<Uint8Array> {
typedef std::uint8_t value_type;
};
// etc.
现在我们可以得到ElementType
:
template <typename T>
Local<T> createTypedArray(size_t elementCount) {
const size_t byteLength =
elementCount * sizeof(typename V8TypeTraits<T>::value_type);
// etc.
return result;
}
显然,你不必做value_type
,你可以把static constexpr element_size = /* whatever */;
放在你的特征中,并使用:
const size_t byteLength =
elementCount * V8TypeTraits<T>::element_size;
但是映射到value_type
是返回C++领域的最短路径(例如,同时拥有value_type
和element_size
是多余的,而前者更通用,所以我选择了那个)。
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 部分专业化和对标准::void_t<>的需求
- 满意和建模的概念?
- "专业化不参与超载"
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- std::initializer_list可以专业化吗?
- 派生类中纯虚拟基方法的专业化
- "expected a '>'"类模板专业化?
- Clang不会编译GCC会编译的模板专业化
- 我可以用clang AST从模板专业化中获得默认的模板参数吗
- 函数模板部分专业化-有什么解决方法吗
- 类模板的编译错误,但其专业化除外