私はいくつかの同様の質問を見てきましたが、私はまだ混乱しています。私はを明示的に(コンパイラの最適化などではなく)にして、特化テンプレート関数に渡すときにオブジェクトのコピーを避けようとしています。ここに私のテストコードは次のとおりです。テンプレートはconst参照で渡す
#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
のオブジェクトを受け取り、そしてコピーを作成します。ここでは、出力は次のようになります(どうやら理由はthis questionに説明されている)
C()
C(C)
f<C>
~C()
~C()
は、だから私はこれを回避するために、(2)
const C&
パラメータに特化しようとしたが、これは単に動作しません。
まあ、私は "ポインタを渡す"ことができましたが、それは一種の醜いです。それで何とかうまくいくことを可能にするトリックはありますか?
編集:ああ、おそらく私は明確ではありませんでした。私はすでにテンプレート関数に
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:[OK]を、私はこのように呼ばれるconst C&
専門強制することができます:
f<const C&>(c);
をしかし、それだけでf(c)
として、次のように動作させるための方法がありますか?誰か最終的に同様の質問を持っている希望の場合、私は最終的に別の質問では、このリンクを見つけて、それが便利です::
void f(const C& c) { cout << "f(const C&)" << endl; }
私はこの2つの特殊化を定義する理由が見つからないため、const参照とコピーを区別する必要があります。そして、私はそれらを区別する方法がないと思う。 –
@ mattia.penati:これは私の意図ではありませんでした。実際には –
です。まず、関数呼び出しで暗黙コピーを避けたい場合は、コピーコンストラクタの前に 'explicit'を置くことができます。これで、関数fを 'テンプレート f(T const&)'と定義できます。それ以外の場合は過負荷を使用します。他に方法はありません。 –