Я просмотрел несколько похожих вопросов, но все еще в замешательстве. Я пытаюсь выяснить, как явно (не с помощью оптимизации компилятора и т. Д.) И C ++ 03-совместимого избежать копирования объекта при передаче его в специализированную шаблонную функцию. Вот мой тестовый код:
#include <iostream>
using namespace std;
struct C
{
C() { cout << "C()" << endl; }
C(const C&) { cout << "C(C)" << endl; }
~C() { cout << "~C()" << endl; }
};
template<class T> void f(T) { cout << "f<T>" << endl; }
// This shows two possible ways, I don't need two overloads
// If I do it like (2) the function is not called, only if I do it like (1)
template<> void f(C c) { cout << "f<C>" << endl; } // (1)
template<> void f(const C& c) { cout << "f<C&>" << endl; } // (2)
int main()
{
C c;
f(c);
return 0;
}
(1) принимает объект типа C
и создает копию. Вот вывод:
C()
C(C)
f<C>
~C()
~C()
Поэтому я попытался специализироваться с параметром const C&
(2), чтобы избежать этого, но это просто не работает (очевидно, причина объяснена в этом вопросе ).
Ну, я мог бы "пройти по указателю", но это некрасиво. Так есть ли какой-нибудь трюк, который позволил бы сделать это как-нибудь красиво?
РЕДАКТИРОВАТЬ: О, вероятно, я не был ясен. У меня уже есть шаблонная функция
template<class T> void f(T) {...}
Но теперь я хочу специализировать эту функцию, чтобы принимать const & для другого объекта:
template<> void f(const SpecificObject&) {...}
Но он вызывается только если я определю его как
template<> void f(SpecificObject) {...}
В основном я хочу адаптировать SpecificObject
к интерфейсу шаблона, например
.
template<> void f(SpecificObject obj){ f(obj.Adapted()); } // call the templated version
EDIT2: Хорошо, я могу заставить специализацию const C&
вызывать так:
f<const C&>(c);
но есть ли способ заставить его работать так, как просто f(c)
?
РЕДАКТИРОВАТЬ3: Если у кого-то в конечном итоге возникнут подобные вопросы, я наконец нашел эту ссылку в другом вопросе, и это полезно: http://www.gotw.ca/publications/mill17.htm