Тип шаблона из переменной - PullRequest
1 голос
/ 02 февраля 2020

Для интерфейса между Unity (C#) и плагином C ++ мне нужна возможность создать экземпляр класса с двумя параметрами шаблона, определенными в Unity. Я не могу передать тип C ++ напрямую, поэтому вместо этого использую операторы char и switch.

Для отдельного параметра это выглядит так:

char type = 'I'; // For example; in practice, it is set from a Unity plugin call)

switch (type)
{
    case 'I':
    {
        ExtArrayExporter<int> * data_link = new ExtArrayExporter<int>(static_cast<int*>(external_array), ext_array_length);
        return(EXT_TYPES::RegisterNew(data_link));
    }
    case 'F':
    {
        ExtArrayExporter<float> * data_link = new ExtArrayExporter<float>(static_cast<float*>(external_array), ext_array_length);
        return(EXT_TYPES::RegisterNew(data_link));
    }
    case 'B':
    {
        ExtArrayExporter<bool> * data_link = new ExtArrayExporter<bool>(static_cast<bool*>(external_array), ext_array_length);
        return(EXT_TYPES::RegisterNew(data_link));
    }
}

Вопрос :

Как мне добиться этого, когда для ExtArrayExporter требуется два типа и у меня есть два символа из Unity?

Тривиально было бы сложить switch операторов, но он быстро растет с увеличением количества типов для рассмотрения и является повторяющимся.

Я надеялся, что смогу присвоить тип переменной, например, чтобы сохранить метод сверху, но, очевидно, это не компилируется:

auto type_a = int;

Предоставляет ли C ++ какое-либо плавное решение для этого случая?

1 Ответ

0 голосов
/ 02 февраля 2020

Я не знаю ExtArrayExporter, EXT_TYPES и т. Д. c., Поэтому я предлагаю общий код c, который вы можете адаптировать под свои нужды.

Он основан на рекурсивном variadi c template foo() функционирует следующим образом

// ground case
template <typename ... Ts>
void foo ()
 { /* do something with Ts... */ }

// recursive case
template <typename ... Ts, typename ... Cs>
auto foo (char c0, Cs ... cs)
 {
   switch ( c0 )
    {
      case 'I':
         return foo<Ts..., int>(cs...);
         break;

      case 'F':
         return foo<Ts..., float>(cs...);
         break;

      case 'B':
         return foo<Ts..., bool>(cs...);
         break;

      // ...
    }
 }

, и вы можете использовать его следующим образом

foo<>('I', 'B', 'F', 'B', 'B', 'I');

или просто

foo('I', 'B', 'F', 'B', 'B', 'I');

Идея заключается в том, что каждый вызов foo() использует аргумент char, преобразуя его в аргумент шаблона и добавляя его в список Ts... variadi c; когда аргумент char завершен (основной случай), вы можете использовать разрешенный параметр шаблона Ts....

Обратите внимание, что это решение является обобщенным c и работает не только для 2, но для неопределенного числа аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...