1

例1

BaseDerivedクラスがある場合

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> >
...
4

1 に答える 1

1

Taあなたがそれを持っている方法では、コンパイラがどのタイプに対しても一致することは不可能です。あなたがこれを持っていたと想像してください:

class DerivedTpl : public BaseTpl<int>, public BaseTpl<char>
{};

Ta一致させようとするとどのようなタイプになりますか?

特定の問題の場合、1つの解決策は、上記のすべてを網羅する基本クラスを導入することですBaseTpl

class BaseNonTpl {};

template <class T>
class BaseTpl : BaseNonTpl
{};

次に、部分的な特殊化を変更して、代わりにその基本クラスを探します。

template <class T>
class PartialyTpl<T, typename std::enable_if<std::is_base_of< BaseNonTpl, T >::value>::type>

そうすれば、コンパイラーは、使用する基本クラスを理解しようとする必要がありません。

于 2012-09-29T15:31:57.687 に答える