gpt4 book ai didi

c++ - 通过宏创建模板特化

转载 作者:行者123 更新时间:2023-11-30 03:39:37 24 4
gpt4 key购买 nike

我正在尝试创建一个辅助方法 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_typeT::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_typeelement_size 是多余的,前者更通用,所以我选择那个)。

关于c++ - 通过宏创建模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com