В ARM ComputeLibrary мы можем иметь объект Tensor различных типов. При выборе типа Tensor мы передаем тип инициализатору распределителя Tensor, например float32 здесь:
my_tensor.allocator()->init(armcl::TensorInfo(shape_my_tensor, 1, armcl::DataType::F32));
Лучшее введение в тему тензорного распределения можно найти в здесь.
Есть несколько типов ARMCL на выбор (см. здесь список). Обратите внимание, что типы ComputeLibrary не являются примитивными, хотя в них можно легко скопировать примитивно типизированные данные.
Однако при написании шаблонного кода C++, в котором можно определять функции для произвольных типов, этот «выбор типа, который не является типом» создает проблему проектирования.
Скажем, я хочу написать функцию, которая принимает данные примитивных типов, таких как int, float или double. В шаблонной функции этот тип будет обозначаться как тип T (или что-то еще).
Теперь предположим, что я хочу скопировать эти данные в тензор ARMCL в рамках шаблонной функции. Этот тензор необходимо инициализировать для правильного типа данных. Нам нужно, чтобы этот тип данных подходил для типа T, поэтому, если T - это float, тогда наш ARMCL должен иметь тип F32, если T - это int, тогда наш тензор должен быть S8 и т. д.
Нам нужно какое-то отображение между примитивными типами и типами ARMCL.
Было бы "хорошим" и разумным подходом иметь служебную функцию, которая принимает тип T и, возможно, использует оператор switch и что-то вроде std::is_same. Оператор switch затем вернет соответствующий объект типа данных библиотеки вычислений ARM для T? Или есть другой подход, который мог бы быть более элегантным?
Я искал документы, чтобы увидеть, обработано ли это уже, но пока безрезультатно. Если он не обрабатывается, то, возможно, это не относится к вопросу ARMCL и имеет более широкий охват.
Мои глаза открылись для большего мира, я никогда раньше не слышал о SFINAE. буду исследовать. спасибо за объяснение, почему мой подход может не работать





Ну ... типы armcl - это, если я правильно понимаю, значения enum.
Таким образом, возможный подход - это структура шаблона с полной специализацией с value в ней.
Я имею в виду ... что-то вроде
template <typename>
struct typeMap;
template <>
struct typeMap<int>
{ static constexpr auto value = armcl::DataType::S8; };
template <>
struct typeMap<float>
{ static constexpr auto value = armcl::DataType::F32; };
// other cases
Вы можете использовать его следующим образом
template <typename T>
void foo ()
{ bar(typeMap<T>::value); }
это именно то решение, которое я искал, спасибо! Структура typeMap по своей природе может быть повторно использована, и ее легко добавить. Хорошая выкройка
std::is_same». Нет, этот подход потерпит неудачу, посколькуswitch()оценивается во время выполнения. Обычным подходом для таких вещей является SFINAE и специализации, которые можно оценить во время компиляции.