0

CRTP、可変個引数テンプレート、メタプログラミング、および演算子のオーバーロードが混在するクラスで、静的アサーションを行うために 2 つの可変個引数 unsigned int テンプレート パラメーターを比較したいと思います。これを行うにはヘルパー構造体が良い方法だと思いますが、正確な方法はわかりません。私は次のような形について考えます:

template<unsigned int... TDIM, unsigned int... TDIM0> struct HelperCheckDimensions
{
    static const bool ok = /* SOMETHING */
};

ここでTDIM、 とTDIM0は、比較したい 2 つのパラメーターです。次のように入力できます。

static_assert(HelperCheckDimensions<TDIM..., TDIM0...>::ok, "ERROR : Dimensions are different !");

sizeof...(TDIM)==sizeof...(TDIM0)ANDの場合にのみ、結果が true になるようにしますTDIM[0] == TDIM0[0], TDIM[1] == TDIM0[1], ..., TDIM[n] == TDIM0[n]

どうやってするか ?

どうもありがとうございました。

4

3 に答える 3

5

この形式のクラス variadic-template は意味をなさないと思います:

template<unsigned int... TDIM, unsigned int... TDIM0> 
struct HelperCheckDimensions
{
    //..
};

私がこれを書いた場合、それは意味がありません:

HelperCheckDimensions<1,2,3,4,5,6> z;

それでは、何TDIMTDIM0すべきですか?コンパイラは引数の分割をどのように行うべきですか?

これは正しいです:

TDIM = (1,2)
TDIM0 = (3,4,5,6)

またはこれは正しいですか:

TDIM = (1)
TDIM0 = (2,3,4,5,6)

またはこれ:

TDIM = (1,2,3,4)
TDIM0 = (5,6)

なぜそれが意味をなさないのかを助けてくれることを願っています。


あなたのコメントから:

とても良い点です!しかし、私の質問は未解決のままです...おそらく何かの形template<unsigned int... TDIM, typename TFAKE, unsigned int... TDIM0>がうまくいくでしょうか?最善の解決策は何ですか?

このフォームのテンプレート定義は、標準では許可されていません。

template<unsigned int... TDIM, typename TFAKE, unsigned int... TDIM0>

少なくともこの場合、私には理にかなっていますが、標準がそれを許可しない理由はわかりません(おそらく、言語に価値のない複雑さが追加されます)。標準によると、template-parameter-packはテンプレート定義の最後のパラメーターでなければなりません。

上記のコードを GCC でコンパイルすると、次のエラーが発生します。

エラー: パラメーター パック 'TDIM' は、テンプレート パラメーター リストの最後にある必要があります

それが役立つことを願っています。

于 2012-08-10T05:52:31.070 に答える
1

プライマリ クラス テンプレートに 2 つのパラメーター パックを含めることはできません。パック ラッパーを使用する必要があります。

template<unsigned int...T> struct intPack;
template<typename T, typename Y> struct HelperCheckDimensions;

template<unsigned int lhs, unsigned int...T, unsigned int rhs, unsigned int...Y> struct HelperCheckDimensions<intPack<lhs,T...>, intPack<rhs, Y...>>
{
static const bool value = lhs==rhs && HelperCheckDimensions<intPack<T...>, intPack<Y...>>::value;
};
template<unsigned int lhs, unsigned int rhs> struct HelperCheckDimensions<intPack<lhs>, intPack<rhs>>
{
static const bool value = lhs==rhs;
};

テスト: http://liveworkspace.org/code/200e10548f3fc589f39401ca0b22e7c8

于 2012-08-10T06:10:35.840 に答える
1

プライマリ テンプレートが次のようになっているとします。

template <int ...> struct Foo;

Fooコンパレータを作成できるようになりました。

template <typename, typename> struct FooCmp : std::false_type { };

template <int A, int B, int ...As, int ...Bs>
struct FooCmp<Foo<A, As...>, Foo<B, Bs...>>
: std::integral_constant<bool, A == B && FooCmp<Foo<As...>, Foo<Bs...>>::value>
{ };

template <> struct FooCmp<Foo<>, Foo<>> : std::true_type { };

使用法:

typedef Foo<1, 3, 4> F1;
typedef Foo<9, 5, 1> F2;

template <typename S, typename T>
std::enable_if<FooCmp<S, T>::value> do_magic(S s, T t) { /* ... */ }

do_magic(F1{}, F2{});
于 2012-08-10T06:13:17.917 に答える