Как перегрузить станд.:: подкачка ()

Unity не позволит вам сделать это, потому что Gameobject содержит все прикрепленные к нему сценарии. Например, рендеринги mesh, коллайдеры и т. Д.

Если вы хотите сказать сериализовать Tranform, вы можете обойти это, создав новую позицию Vector3, масштаб Vector3, кватернион Vector4 и затем сериализуйте это, а затем на десериализацию подают эти данные в новый Transform (например).

Но попытка сериализации фактических данных сетки, связанная с рендерером mesh, оказалась бы довольно сложной задачей. Лучше всего просто сериализовать int или что-то, что представляет собой идентификатор сетки, а затем трансформировать его в правильную ссылку на загрузку.

112
задан sbi 22 March 2013 в 18:30
поделиться

3 ответа

Правильный способ перегрузки свопа - записать его в том же пространстве имен, что и то, что вы обмениваете, чтобы его можно было найти с помощью аргумента -зависимый поиск (ADL) . Один особенно простой вариант:

class X
{
    // ...
    friend void swap(X& a, X& b)
    {
        using std::swap; // bring in swap for built-in types

        swap(a.base1, b.base1);
        swap(a.base2, b.base2);
        // ...
        swap(a.member1, b.member1);
        swap(a.member2, b.member2);
        // ...
    }
};
127
ответ дан 24 November 2019 в 02:48
поделиться

Вам не разрешает (стандарт C++) к станд. перегрузки:: подкачка, однако Вам конкретно разрешают добавить шаблонные специализации для Ваших собственных типов к пространству имен станд. Например,

namespace std
{
    template<>
    void swap(my_type& lhs, my_type& rhs)
    {
       // ... blah
    }
}

тогда использования в контейнерах станд. (и где-либо еще) выберут Вашу специализацию вместо общей.

Также примечание, что обеспечение реализации базового класса подкачки не достаточно хорошо для Ваших производных типов. Например, если Вы будете иметь

class Base
{
    // ... stuff ...
}
class Derived : public Base
{
    // ... stuff ...
}

namespace std
{
    template<>
    void swap(Base& lha, Base& rhs)
    {
       // ...
    }
}

, то это будет работать на Базовые классы, но при попытке подкачать два Производных объекта, то это будет использовать универсальную версию от станд., потому что шаблонная подкачка является точным совпадением (и это избегает проблемы только свопинга 'основных' частей Ваших производных объектов).

ПРИМЕЧАНИЕ: я обновил это для удаления неправильных битов из моего последнего ответа. D'oh! (спасибо puetzk и j_random_hacker для указания на него)

53
ответ дан Dan Nissenbaum 24 November 2019 в 02:48
поделиться

В то время как это корректно, что не нужно обычно добавлять материал к станд.:: пространство имен, добавление шаблонных специализаций для пользовательских типов конкретно позволяется. Перегрузка функций не. Это - тонкое различие:-)

17.4.3.1/1, Это не определено для программы C++ для добавления объявлений или определений станд. пространства имен или пространствам имен со станд. пространства имен, если иначе не определено. Программа может добавить шаблонные специализации для любого стандартного шаблона библиотеки к станд. пространства имен. Такая специализация (завершенный или неравнодушный) стандартной библиотеки приводит к неопределенному поведению, если объявление не зависит от пользовательского названия внешней связи и если шаблонная специализация не отвечает стандартным требованиям библиотеки для исходного шаблона.

специализация А станд.:: подкачка была бы похожа:

namespace std
{
    template<>
    void swap(myspace::mytype& a, myspace::mytype& b) { ... }
}

Без template<> бит это была бы перегрузка, которая не определена, а не специализация, которая разрешена. @Wilka предполагает, что подход изменения пространства имен по умолчанию может работать с пользовательским кодом (из-за поиска Koenig, предпочитая версию пространства имен меньше), но этому не гарантируют, и на самом деле действительно не предполагают к (реализация STL должна использовать полностью определенный станд.:: подкачка).

существует поток на comp.lang.c ++. модерируемый с длинный обсуждение темы. Большая часть из него о частичной специализации, хотя (который в настоящее время нет никакого хорошего способа сделать).

29
ответ дан puetzk 24 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: