型ではないテンプレート パラメーターは、明らかに型ではないものです。次に例を示します。
template<int x>
void foo() { cout << x; }
その場合以外にも選択肢はありますので、こちらの素晴らしい回答int
を参考にしたいと思います。
さて、私を悩ませていることが 1 つあります。構造体です。検討:
struct Triple { int x, y, z; };
Triple t { 1, 2, 3 };
template<Triple const& t>
class Foo { };
ここで、通常の非型参照セマンティクスを使用して、次のように記述できます。
Foo<t> f;
ここで注目に値するのは、それがor でさえt
ないということです。これは内部リンケージを意味するためです。これは基本的に、行がコンパイルされないことを意味します。として宣言することでそれをバイパスできます。それ自体は少し奇妙かもしれませんが、私が本当に不思議に思ったのは、なぜこれが不可能なのかということでした:constexpr
const
t
const extern
Foo<Triple { 1, 2, 3 }> f;
コンパイラから非常にまともなエラーが発生します。
エラー:左辺値ではないため
Triple{1, 2, 3}
、型の有効なテンプレート引数ではありません。const Triple&
Triple
許可されていないため、値でテンプレートに指定することはできません。ただし、その小さなコード行の実際の問題を理解できません。構造体を値パラメーターとして使用できない理由は何ですか。3 つの s を使用できる場合int
、3 つの int の構造体を使用しないのはなぜですか? 些細な特殊メンバーしか持たない場合は、3 つの変数だけを扱う場合と実際には変わらないはずです。