我审视了几个类似的问题,但我仍然混淆不清。 I m试图说明如何直截了当的(不是通过优化汇编等)和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()
So I ve tried to specialize with a const C&
parameter (2) to avoid this, but this simply doesn t work (apparently the reason is explained in this question).
当然,我可以“绕过点”,但这种ug。 因此,是否允许这样做?
EDIT:Oh,也许我很不清楚。 我已经有了一个模版的职能。
template<class T> void f(T) {...}
但我现在要专门履行这一职能,以接受一个组合;另一个目标:
template<> void f(const SpecificObject&) {...}
但是,如果我把它定义为:
template<> void f(SpecificObject) {...}
Basically what I want to do with this specialization is to adapt the SpecificObject
to the template interface like
template<> void f(SpecificObject obj){ f(obj.Adapted()); } // call the templated version
EDIT2:O,我可以强制使用<条码>const C&专业化,称为:
f<const C&>(c);
但它有办法使之像现在这样发挥作用:f(c)
?
EDIT3:如果某个人最终会有类似问题,我最后在另一个问题上发现这一联系,这很有帮助:rel=“nofollow noreferer” http://www.gotw.ca/publications/mill17.htm。