1

次のタイプを検討してください

template <typename T1, typename T2, typename T3>
struct either_or
{
    /* Here I need such an error type that says "Sorry, T1 is not an accepting type." */
    typdef error<T1> type;
};
template <typename T1, typename T3>
struct either_or <T1, T1, T3>
{
    typedef T1 type; //T1 Ok
};
template <typename T1, typename T2>
struct either_or <T1, T2, T1>
{
    typedef T1 type; //T1 Ok
};

/* Here is function that might accept error type variable */

template <typename T>
void foo(typename either_or<T, char, unsigned char>::type x)
{
    /*print char or unsigned char except that T is not printable*/
}

この場合に使用する C++ の型システムにエラー型はありますか? そうでない場合、私はそれを実現できますか、またはどのように実現できますか?

4

2 に答える 2

4

いいえ、言語または標準ライブラリによって提供されるそのようなタイプはありません。必要に応じて、自分で作成することもできます。

template <typename T>
struct error { };

もう1つのオプションは、基本テンプレートから定義を単純に省略することです。、、、およびtypeの値が2つの特殊化のいずれにも一致しない場合、メンバーを持たない基本テンプレートを取得します。これにより、コンパイラはそのバージョンのを考慮しなくなり、無効な引数タイプで呼び出そうとすると、最終的にコンパイルエラーが発生します。T1T2T3typefoo

于 2012-07-09T21:12:16.717 に答える
1

どうですか:

template <typename T1, typename T2, typename T3>
struct either_or
{
    static_assert(false, "Sorry but this doesn't work for type T1");
    //typdef error<T1> type;
};
template <typename T1, typename T3>
struct either_or <T1, T1, T3>
{
    typedef T1 type; //T1 Ok
};
template <typename T1, typename T2>
struct either_or <T1, T2, T1>
{
    typedef T1 type; //T1 Ok
};

/* Here is function that might accept error type variable */

template <typename T>
void foo(typename either_or<T, char, unsigned char>::type x)
{
    /*print char or unsigned char except that T is not printable*/
}

次のように表示されます。

error: Sorry but this doesn't work for type T1
when instantiating either_or<T1,T2,T3>
with T1 = <typename>, T2=<typename>, T3=<typename>

コンパイルされた場合 - 正確なエラー メッセージはもちろんコンパイラによって異なります。質問したい場合 - いいえ、実際のタイプ名をメッセージに統合することはできません-このスレッド"Sorry but this doesn't work for type T1"を参照してください。

于 2012-07-09T21:27:53.763 に答える