2016-04-08 9 views
0

私は、次のテンプレート関数があります。C++専門のコンストラクタ(角括弧をスキップ)

template<> 
int test_function(int arg) {return arg;} 

この:

template<typename T> 
T test_function(T arg) {return arg;} 

を私は整数のこの特殊なバージョンを作成することができますこの関数を整数でたくさん使うと実用的です。だから、私はそれを呼び出すことができます。今すぐ

test_function(some_integer);  // easy! 
test_function<int>(some_integer); // not necessary all the time. 

I持って、次のクラス:

Foo foo1;  // how do I do this? 
Foo<int> foo2; // I don't want to use this all the time. 

がどのように私はこれを定義することができます。私はそれを呼び出すことができるようにしたい

template<typename T> 
class Foo 
{ 
public: 
    Foo(); 
}; 

クラスを使用しないでインスタンスを作成できるようにするにはどうすればいいですか?あまりにもハードだと思うべきではありませんが、私はあなたがデフォルトの引数(int)を使用し、必要がありますいずれかのこれまでの...

+2

'int'のために' test_function'の特殊化を作成する必要はありません(別の何かをしない限り)、引数から型を推論することができます。 –

+1

引数の型を推論してmake_関数で構造体を構築します。例については、std :: make_tupleを参照してください。 –

+0

@AntonSavinああ、私はヒントのためにあなたをありがとう、参照してください! – donald

答えて

0
template<typename T> 
T test_function(T arg) {return arg;} 

template<> 
int test_function<int>(int arg) {return arg;} 
+0

はい、これは関数の例でも機能しますが、クラスに対してどうすればいいですか? – donald

+0

クラスの関数は、次のようにクラス外で特殊化することができます: 'template <> MyClass :: MyClass(){/ * int * /}コンストラクタ –

2

それを把握することができませんでした:

template<typename T = int> class Foo {}; 
Foo<> foo2; 

またはメイクを別名:

using MyFoo = Foo<int>; //or just Foo<> if using default argument 
MyFoo foo1; 

私はあなたはそれがすべてのテンプレート引数にはデフォルト値を持っている場合でも、テンプレートクラスであることを示すことなく、テンプレートクラスのオブジェクトを作成することはできませんと信じています。

注:usingはC++ 11キーワードです。レガシーコード/コンパイラにはtypedefを使用してください。

+0

括弧を付けないほうがいい理由は、このクラスを使いやすくするためです。エイリアスのヒントをありがとう、私は他の解決策がない場合、これと一緒に行くと思う。 – donald

+0

@donaldこれは標準的な方法です。 'using'は実際には本当にうれしく、主にこの目的のために存在します。その構文も 'typedef'よりも優れており、一貫性があり、クラス内でネストすることができます:' class A {public:using B = SomeClass; } '' A :: B'は有効な型( 'SomeClass'へのエイリアス)です。 – Resurrection

+0

'typedef'は対応する' using'宣言と全く同じ意味であり、特にクラス内にネストすることもできます。 –