Вы не указали , почему вы хотели передать shared_ptr, поэтому я собираюсь дать ответ, исходя из предположения, что это было без веской причины.
IКак правило, можно ожидать, что если функция взяла умный указатель, то это потому, что эта функция может захотеть сохранить или манипулировать указателем каким-либо образом.Поскольку ваш пример не передает shared_ptr по ссылке, я могу предположить, что вы не хотите иметь возможность удалять объект изнутри функции.Возможно, вы хотите сохранить общую ссылку для последующего использования, но , которая несовместима с версией вашей функции, которая принимает основанный на стеке объект .Исходя из ваших спецификаций, это могут быть две принципиально разные функции (ЕСЛИ вам действительно нужно взять shared_ptr И вы также хотите принять переменную стека).Итак, как я уже говорил ранее, я предполагаю, что вам на самом деле не нужен shared_ptr внутри функции .
Итак, вот версия вашего кода, которая делает то, что, как мне кажется, вам нужно...
void a( C & val ) // just pass by reference (or const reference)
{
val.member = 10; // for example
}
shared_ptr<X> v(new X());
a(*v); // simply dereference the pointer to call the function
// verify that v holds an object if it isn't obvious from the context
if ( v ) a(*v);
class C
{
C() { a(x); } // nothing fancy required to call the function
X x;
};
Этот подход обеспечивает те же функциональные возможности, что и решение на основе шаблона , не требуя от вашей функции a
внутреннего использования основанного на указателе синтаксиса.
Еще один пример, полученный из ответа Эвана ...
std::vector<int>::iterator it = v.begin();
a(*it); // also works