Я пытаюсь создать вспомогательный метод 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
Er, почему бы вам просто не использовать 'sizeof (T)'? – GManNickG
@GManNickG, к сожалению, это 1 для всех типов. (Float32Array и друзья из v8 - я не могу этого контролировать.) – ZachB
Yikes, это некоторые плохо разработанные классы. Там даже нет никаких typedefs или констант или функций или чего-либо для получения размера элемента. Я бы предложил сделать что-то вроде 'template struct V8ArrayToElementSize;' и специализировать его для каждого типа массива, например 'template <> struct V8ArrayToElementSize {static constexpr value = 1; }; '. Затем вы можете использовать свою одну функцию и заменить 'bytesPerElement' на' V8ArrayToElementSize :: value'. –
GManNickG