テンプレート静的メソッドの特定のインスタンスの命名規則は何ですか?テンプレート静的クラスメソッドの特定のインスタンスの命名規則
すべて以下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>;
};
テンプレート静的メソッドの特定のインスタンスの命名規則は何ですか?テンプレート静的クラスメソッドの特定のインスタンスの命名規則
すべて以下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>;
};
この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;
}
。
C++は、あなたがそれを持ち上げるために必要
(hereを参照してください)のテンプレートメソッドを持つローカル構造体が好きではありません。また、typedefのためにdecltypeを使いたいと思っていますか?例えば
typedef decltype(f<0>) t;
using g1 = decltype(f<0>);
これらは、あなたにタイプを与えるだけです。おそらくそれらを直接呼び出すのが最も良いでしょう。 S ::ここg1
f<1>
ない< 0>など
struct S {
template<int x> static int f() { return x; }
static int g1() { return f<1>(); }
};
ノートF - 例えば&S::f<1> != &S::g1
。しかし、それを呼び出すのと同じ効果があります。 (いくつかのリンカーでは、これは当てはまらないかもしれません; msvcリンカー、または金リンカーが積極的に設定します)
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
を落とすことができます。
'使用する名前をタイプする。関数は型ではありません。 'f <1>'は関数です。この名前付けに何をしたいのか、どのように使いたいのか説明できますか?あなたが 'static int f_1(){return 1; } '、' f <1> 'の代わりにそれを使って何をしたいのか、どうすればいいのか説明してください。 – Yakk
@Yakk私はタイプの名前付けに興味がありませんが、後でf <1>の代わりにg()を呼び出すことができるように、いくつかの名前(例:g)でf <1>を命名することに興味があります。関数テンプレートのこの特定のインスタンスへの呼び出し。あなたが書いたことに従うことは可能です(合理的です)。これはツールを使用しないことです。私はそれをどうすればいいのですか? – Danra
*値* 'f <1>'を保持できる*変数*が必要な場合は、auto: 'auto g = f <1>' – Caleth