コンパイル時の値に基づくC ++テンプレートの特殊化
-
12-12-2019 - |
質問
ゆっくりと、ゆっくりテンプレートメタプログラミングに途中を感じています、そして、次の実装方法はわかりません:
// hpp file
enum MyEnum { Alive = 0, Dead };
class A {
public:
template<typename T, typename O, MyEnum ls>
static int Register();
};
// elsewhere in the code...
A::Register<IType1, Type1, Dead>();
.
コンパイル時には、DEADまたはALIVEのいずれか、3番目のテンプレートの種類が列挙型値(コンパイル時不変)のものを知っています。レジスタ機能の2つのボディを定義することができます。
// desired hpp file
template<typename T, typename O, Alive>
int Register();
template<typename T, typename O, Dead>
int Register();
// corresponding desired .inc file
template<typename T, typename O, Alive>
int Register() { // Alive specific implementation ... }
template<typename T, typename O, Dead>
int Register() { // Dead specific implementation ... }
.
私は次の点を見ました: 定数値を持つC ++テンプレートの特殊化
しかし、この状況にどのように適用するかを理解することができなかった。
解決
テンプレート機能を部分的に専門化することはできません。解決策はそれを構造体に包むことです:
template<typename T, typename O, MyEnum ls>
struct foo;
template<typename T, typename O>
struct foo <T, O, Alive> {
static int Register() {
// ...
}
};
template<typename T, typename O>
struct foo <T, O, Dead> {
static int Register() {
// ...
}
};
template<typename T, typename O, MyEnum ls>
int Register() {
return foo<T, O, ls>::Register();
}
. 他のヒント
ここでのパーティーに非常に遅れていますが。
これを行う方法は、概念的により簡単で読みやすいことが単に異なる型の異なる値を単に(名前空間内の内側に、きれいに保つために)と考えています。(テンプレート)関数の過負荷の利点:
namespace State {
struct Dead {};
struct Alive {};
}
template<typename T, typename O>
int Register(State::Dead) {
return 1;
}
template<typename T, typename O>
int Register(State::Alive) {
return 2;
}
.
このようにそれらを呼び出します:
int main() {
Register<int,int>(State::Dead());
Register<int,int>(State::Alive());
return 0;
}
. 所属していません StackOverflow