Вы можете отобразить имя переменной с помощью препроцессора. Например,
#include
#define quote(x) #x
class one {};
int main(){
one A;
std::cout<
выводит
3one A
на мою машину. #
изменяет токен в строку после предварительной обработки строки
std::cout<
Конечно, если вы сделаете что-то вроде
void foo(one B){
std::cout<
, вы получите
3one B
, поскольку компилятор не отслеживает все имена переменных.
Как это происходит в gcc, результат typeid (). name () - это искомое имя класса, получить demangled version использовать
#include
#include
#define quote(x) #x
template class one{ };
int main(){
one > A;
int status;
char * demangled = abi::__cxa_demangle(typeid(A).name(),0,0,&status);
std::cout<
, который дает мне
one > A
Другие компиляторы могут использовать разные схемы именования.
Добавление <Array<Item>>
на самом деле не превратит объект в массив, это просто приведение к тому, чтобы машинописание воспринимало его как массив, и вообще не влияет на созданный javascript.
Проблема в том, что оператор распространения, который вы используете для клонирования вашего массива, создает общий объект, а не массив:
this.selectedItems = {...selectedItems};
Синтаксис {...obj}
копирует собственные перечисляемые свойства из предоставленного объекта в новый объект. Источник
blockquote>Таким образом, результирующий объект имеет свойство длины и все пронумерованные свойства массива, в который вы передали, но это объект, а не массив и поэтому не ' у нас есть методы Array.prototype.
Однако вы можете использовать оператор распространения для клонирования массива, вам просто нужно использовать квадратные скобки, чтобы обозначить, что вы создаете массив:
this.selectedItems = [...selectedItems];
Вы также можете клонировать массив, используя слайс :
this.selectedItems = selectedItems.slice(0);