2017-01-16 6 views
0

テンプレート静的メソッドの特定のインスタンスの命名規則は何ですか?テンプレート静的クラスメソッドの特定のインスタンスの命名規則

すべて以下attemptsが間違っているように見える:

struct S 
{ 
    template<int x> static int f() { return x; } 
    using g1 = f<1>; 
    template using g2 = f<1>; 
    template<> using g3 = f<1>; 
}; 
+3

'使用する名前をタイプする。関数は型ではありません。 'f <1>'は関数です。この名前付けに何をしたいのか、どのように使いたいのか説明できますか?あなたが 'static int f_1(){return 1; } '、' f <1> 'の代わりにそれを使って何をしたいのか、どうすればいいのか説明してください。 – Yakk

+0

@Yakk私はタイプの名前付けに興味がありませんが、後でf <1>の代わりにg()を呼び出すことができるように、いくつかの名前(例:g)でf <1>を命名することに興味があります。関数テンプレートのこの特定のインスタンスへの呼び出し。あなたが書いたことに従うことは可能です(合理的です)。これはツールを使用しないことです。私はそれをどうすればいいのですか? – Danra

+1

*値* 'f <1>'を保持できる*変数*が必要な場合は、auto: 'auto g = f <1>' – Caleth

答えて

0

このworks:私たちは、特定のテンプレート関数のインスタンスに名前を付けるauto&を使用することにより

#include <iostream> 

struct S { 
    template<int x> static int f() { return x; } 
}; 

auto& g = S::f<1>; 

int main() { 
    std::cout << g() << std::endl; 
    return 0; 
} 

0

C++は、あなたがそれを持ち上げるために必要

hereを参照してください)のテンプレートメソッドを持つローカル構造体が好きではありません。また、typedefのためにdecltypeを使いたいと思っていますか?例えば

typedef decltype(f<0>) t; 
using g1 = decltype(f<0>); 

これらは、あなたにタイプを与えるだけです。おそらくそれらを直接呼び出すのが最も良いでしょう。 S ::ここg1f<1>ない< 0>など

0
struct S { 
    template<int x> static int f() { return x; } 
    static int g1() { return f<1>(); } 
}; 

ノートF - 例えば&S::f<1> != &S::g1。しかし、それを呼び出すのと同じ効果があります。 (いくつかのリンカーでは、これは当てはまらないかもしれません; msvcリンカー、または金リンカーが積極的に設定します)

0

usingはエイリアスを定義します。 usingは、クラス、型などのエイリアスを定義します。エイリアスと特殊化は、全く異なる2つのことです。

f()はクラスではありません。それは方法です。この種のクラス、さまざまな種類、および事柄には、usingまたはtypedefという別名を付けることができます。しかし、関数やメソッドではありません。

あなたはクラスメソッドを専門にしたい場合は、クラス外メソッドのための特殊化を定義します。

template<> 
int S::f<1>() 
{ 
    return 0; // Or whatever your specialization function needs to do. 
} 

あなたが関数のエイリアスをしたい場合は、これは基本的にラッパーです:

int f1() 
{ 
    return f<1>(); 
} 

したがって、f1()を呼び出すと、特殊なメソッドが呼び出されるようになりました。

静的クラスメソッドの特殊化とエイリアスを行う場合は、余計なことがあります。クラス内でラッパーをインラインで定義することはできません。これは、専門化がまだ宣言されていないためです。あなたはラッパーを宣言しなければなりません。その後、特殊化を定義した後、それを定義します。これは実際には、リンク時に重複したシンボルを避けるために、ヘッダファイルに入っている場合

#include <iostream> 

struct S 
{ 
    template<int x> static int f() { return x; } 
    static int f1(); 
}; 

template<> 
int S::f<1>() 
{ 
    return 0; 
} 

inline int S::f1() 
{ 
    return f<1>(); 
} 

int main() 
{ 
    std::cout << S::f<4>() << std::endl; 
    std::cout << S::f<1>() << std::endl; 
} 

inlineが必要とされています。すべてが1つの翻訳単位に入ったら、inlineを落とすことができます。

+0

'using f2 = f <1>'はコンパイルされません – Danra

+0

ラッピングを伴わない方法を探しています。特定のテンプレートメソッドインスタンスの名前を探すだけです。ラッピングメソッドを使用すると動作しますが、たとえば、次のような場合にはunDRYになります。まだインスタンス化されていないより多くのパラメータ – Danra

+0

これは編集残して修正されたものです。 –