例1
Base
とDerived
クラスがある場合
class Base
{};
class Derived : public Base
{};
およびテンプレートクラス
template <class T, class Enabler=void>
class Partialy
{
public:
void say()
{
std::cout << "Partialy Default" << std::endl;
}
};
次の方法で部分的な特殊化を書くことができます:
template <class T>
class Partialy<T, typename std::enable_if<std::is_base_of< Base, T >::value>::type>
{
public:
void say()
{
std::cout << "Partialy special" << std::endl;
}
};
例1は問題なく動作します。(完全なコード: http: //ideone.com/4FyrD)
例2
Base
クラステンプレートを1つにすると、次のようになります。
template <class T>
class BaseTpl
{};
class DerivedTpl : public BaseTpl<int>
{};
次の部分的な専門化は機能しません:
template <class T, class Ta>
class Partialy<T, typename std::enable_if<std::is_base_of< BaseTpl<Ta>, T >::value>::type>
{
public:
void say()
{
std::cout << "Partialy special with TPL" << std::endl;
}
};
例2はコンパイルされませんコンパイラはエラーをスローします"template parameters not used in partial specialization:"
(完全なコード:http://ideone.com/gZ6J2)
質問
だから問題はです。から派生したすべてのクラスで機能する部分的な特殊化を作成する方法はありますかBaseTpl
。
スペシャライゼーションが機能するクラスのリスト:
class A1 : public BaseTpl<int>
class A2 : public BaseTpl<std::string>
class A3 : public BaseTpl<vector<int> >
...