Хотя Base
и Derived
являются ковариантными и необработанные указатели на них будут действовать соответственно, shared_ptr<Base>
и shared_ptr<Derived>
не являются не ковариантными. dynamic_pointer_cast
является правильным и простым способом решения этой проблемы.
( Редактировать: static_pointer_cast
было бы более уместно, потому что вы проводите от производной к базовой, что безопасно и не требует проверок во время выполнения. См. Комментарии ниже.)
Однако, если ваша функция foo()
не желает участвовать в продлении срока службы (или, скорее, участвовать в общем владении объектом), то лучше всего принять const Base&
и разыменовать shared_ptr
] при передаче его на foo()
.
void foo(const Base& base);
[...]
shared_ptr<Derived> spDerived = getDerived();
foo(*spDerived);
Кроме того, поскольку типы shared_ptr
не могут быть ковариантными, правила неявного преобразования через ковариантные типы возвращаемых данных не применяются при возврате типов shared_ptr<T>
.
В наши дни делать такие вещи без библиотеки - безумие. Однако я предполагаю, что вы хотите узнать, как это работает. Я бы посоветовал вам изучить исходный код jQuery или одной из других библиотек javascript.
Имея это в виду, функция выбора должна включать много операторов if / else / else if или switch case для обработки всех разные селекторы. Пример:
function select( selector ) {
if(selector.indexOf('.') > 0) //this might be a css class
return document.getElementsByClassName(selector);
else if(selector.indexOf('#') > 0) // this might be an id
return document.getElementById(selector);
else //this might be a tag name
return document.getElementsByTagName(selector);
//this is not taking all the different cases into account, but you get the idea.
};
Создание механизма выбора - непростая задача. Я бы посоветовал изучить то, что уже существует:
Вот хороший фрагмент, который я использовал несколько раз. Он действительно маленький и аккуратный. Он поддерживает все обычные селекторы CSS.
Нет, встроенного способа нет. По сути, если вы решите отказаться от jQuery, вы скопируете его версию с ошибками в свой код.