テンプレート パラメーターに入れ子になった type/typedef XYZ があるかどうかを確認したいとします。
template <class T>
struct hasXZY
{
typedef char no;
typedef struct { char x[2]; } yes;
template <class U>
static yes f(typename U::XYZ*);
template <class /*U*/>
static no f(...);
enum {value = sizeof(f<T>(0))==sizeof(yes)};
};
期待どおり、正常に動作します。
これを考慮してください:
template <class T>
struct hasXZY
{
typedef char no;
typedef struct { char x[2]; } yes;
static yes f(typename T::XYZ*);
static no f(...);
enum {value = sizeof(f(0))==sizeof(yes)};
};
hasXYZ<int>
コンパイル時エラーが発生するようになりました。OK、f はテンプレート関数ではありません。しかし一方で、hasXYZ
が int を介してインスタンス化されると、コンパイラは候補リストからhasXYZ<int>::value
簡単に除外できます。f(int::XYZ*)
クラス テンプレートのメンバー関数宣言のインスタンス化に失敗すると、クラスのインスタンス化全体が失敗する理由がわかりません。何か案は?
編集:私の質問は:なぜメンバー関数宣言はすべて整形式でなければならないのですか? コンパイラは使用時にのみメソッドをインスタンス化するため、正しい宣言が必要なのはなぜですか。この機能の使用例として、上記の例 2 を検討してください。