2

C++ テンプレート メタプログラミングを読み、そこに含まれる演習を行ったところ、問題が発生しました。問題の核心は、この小さな例で見ることができます:

    template <class A, class B>
    struct C;

    template <class A>
    struct C<A,A>
    {
      typedef some_type type;
    };

    template <class A, class B>
    struct C<A*,B>
    {
      typedef some_other_type type;
    };

    int main()
    {
      C<int*,int*> c;
    }

c の型があいまいであるため、これはコンパイルに失敗します。コンパイラは、どの特殊化をインスタンス化する必要があるかを判断できませんが、このような場合、最初の特殊化を呼び出す必要があることはわかっています。私がこれまでに思いついた解決策は、このように書き直すことです

    template <class A, class B>
    struct C;

    template <class A, class B>
    struct C<A*,B>
    {
      typedef typename boost::mpl::if_c<boost::is_same<A*,B>::value,
                                        some_type, some_other_type>::type type;
    };

この解決策の問題は、実際にはポインター、const、参照、および配列型のそれぞれに部分的な特殊化があるため、このチェックを各特殊化に個別に追加する必要があったことです。

私の質問は、以前の素晴らしいコンパクトな特殊化を持ち、何らかの方法で微調整して、コンパイラが特殊化をインスタンス化する方法があるかどうかです。

     template <class A>
     struct C<A,A>
     {
       typedef some_type type;
     };

あいまいな場合に備えて、他の専門分野の代わりに?

興味のある方のために、私が取り組んでいる質問は第 2 章の質問 1 です。

4

1 に答える 1

2

基本テンプレートに別のパラメーターを追加し、それを使用して特殊化を有効/無効にすることができます。たとえば、次のような場合があります。

template< class A, class B, class Enable = void >
struct C;
template< class A >
struct C<A, A, void> {...};
template< class A, class B >
struct C<A*, B, typename boost::disable_if<boost::is_same<A*, B> >::type> {...};

is_constこれで、constポインターなどを処理する場合は、タイプtraits( 、、is_pointer...)に従って条件を拡張できます。

于 2012-10-16T03:40:40.583 に答える