次のようなコードがあります。
// filexd.h
function() {
// nDim is a compile time constant
#if DIMENSIONS == 2
static const int a[nDim] = {1,0};
#elif DIMENSIONS == 3
static const int a[nDim] = {2,0,1};
#else
#error "Unknown # of dimensions"
#end
// do stuff with a...
}
このファイルは、マクロ DIMENSIONS を再定義する他のユーザーによってインクルードされます。私がしたいのは次のようなものです:
static const int a[nDim] = (nDim == 2) ? {0,1} : {1,0,2};
どちらの場合もコードの 99% が同一であるため、関数テンプレートの特殊化またはタグ ディスパッチを使用したくありません。すでに持っていたのと同じ関数構成と、変数 a のローカル セマンティクスを保持したいと思います。質問は次のとおりです。
この状況でマクロを使用しないようにするにはどうすればよいですか?
ここで C++1y テンプレート変数を使用できますか? 以下は機能しますか?
// filexd.h
function() {
// The general case should fail somehow, maybe displaying a nice error message.
template<int nDim> constexpr int stencil[nDim] = throw();
// And then define the variable for both cases:
template<> constexpr int stencil<2>[2] = {1, 0};
template<> constexpr int stencil<3>[3] = {2, 0, 1};
static const stencil<nDim> a;
for(int i = 0; i < nDim; ++i) {
/// do stuff with a[i]
}
}
関数自体の内部で特殊化されたステンシル テンプレート変数を宣言できますか?