0

TクラステンプレートのタイプパラメータにPODタイプ制約を設定し、満足のいくものからA別のクラステンプレートを派生させたいと思います。また、のインスタンスの恒常性に応じて実装が異なることになっています。これをすべて行う目的は、実行前の型チェックを改善することです。BABA

私が理解できるのは、A

template <typename T, typename POD=void>
class A;
template <typename T>
class A <T, std::enable_if<std::is_pod<T>::value>::type>
{
    //blah...
};

部分的なパラメータ化がタイプスイッチのようなトリックを行うことに気付いたかもしれないので、非PODタイプを渡すときにAをインスタンス化できないようにします。

しかし、Bをどのように定義できるかわかりません。次のように見えると思います

template <typename A?>
class B;
template <>
B<const A?> : public A?
{
    //blah...
};
template <>
B<A?> : public A?
{
    //blah...
};

素晴らしいアイデアはありますか?

PS:個人的に私は非常に批判的である傾向があります。しかし、とにかくこれができると思う方法を投稿してください。

4

1 に答える 1

1

専門分野が完全に異なるものになるかどうかについては、素晴らしいアイデアはありません。あなたはこれで行かなければなりません:

template <typename T>
class B;

template <typename T>
class B<const A<T>> : public A<T>
{

};

template <typename T>
class B<A<T>> : public A<T>
{

};

これは、記号を除いて、自分で書いたものとほとんど同じです。?

このクラスは次のようにインスタンス化できます。

B<A<int>>       x; //it chooses the second specialization
B<const A<int>> y; //it chooses the first specialization

オンラインデモをご覧ください。ここで忘れていることに注意してくださいtypename

typename std::enable_if<std::is_pod<T>::value>::type

私もそれを修正しました。

スペシャライゼーションの一部のコードが同じになる場合は、共通の部分を共有するためにいくつかのトリックを行うことができますが、スペシャライゼーションに何を入れるのかわからないため、何も提案できません。

于 2013-03-05T05:03:35.617 に答える