私はいくつかの同様の質問を調べましたが、それでも混乱しています。明示的に(コンパイラの最適化などではなく)、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