3

この次のコードに疑問を抱きました

struct base {};
struct derived : public base {};

template <class T>
struct Type { };

template <> struct Type<base> {
  typedef float mytype;
};

typename Type<base>::mytype a=4.2;    // this works
typename Type<derived>::mytype a=4.2; // this doesnt

クラステンプレートオブジェクトをインスタンス化できない理由を誰かが説明し、derivedそれを行う簡単な方法を提案できますか? 私が興味を持っている実際の問題については、テンプレートクラスオブジェクトをインスタンス化したり、typedefs を使用したりするために使用する多くの派生クラスがあります。私が個別に専門化したいものよりも、それらの数が多すぎます。

編集: 言い忘れましたが、これは C++03 である必要があります

4

2 に答える 2

4
#include <iostream>
#include <type_traits>

struct base { };
struct derived : base { };

template<typename T, bool = std::is_base_of<base, T>::value>
struct Type { };

template<typename T>
struct Type<T, true>
{
   typedef float mytype;
};

int main()
{
   Type<base>::mytype a1 = 4.2f;
   Type<derived>::mytype a2 = 8.4f;
   std::cout << a1 << '\n' << a2 << '\n';
}

C ++ 03では、簡単に次のstdように置き換えることができますboostboost::is_base_of

于 2012-11-27T08:36:55.823 に答える
2

テンプレート引数が異なるテンプレートクラスの2つのインスタンス化は、まったく関係のないクラスタイプです。Type<derived>とはまったく関係がありませんType<base>。これは、もちろん、特殊化を使用せず、プライマリテンプレートからインスタンス化されることを意味します。プライマリテンプレートにはネストされたタイプはありませんmytype

于 2012-11-27T08:38:16.240 に答える