1. ホーム
  2. c++

[解決済み] 特定の型しか受け付けないC++テンプレート

2022-04-16 18:36:53

質問

Javaでは、任意のクラスを拡張した型のみを受け入れるジェネリッククラスを定義することができます。

public class ObservableList<T extends List> {
  ...
}

これは、"extends" キーワードを使用して行われます。

C++でこのキーワードに相当する簡単なものはあるのでしょうか?

どのように解決するのですか?

Boostの 静的アサート と連携して is_base_of Boost Type Traits ライブラリから提供されています。

template<typename T>
class ObservableList {
    BOOST_STATIC_ASSERT((is_base_of<List, T>::value)); //Yes, the double parentheses are needed, otherwise the comma will be seen as macro argument separator
    ...
};

他のもっと単純なケースでは、グローバルテンプレートを単純に前方に宣言し、有効な型に対してのみ定義(明示的または部分的に特殊化)することができます。

template<typename T> class my_template;     // Declare, but don't define

// int is a valid type
template<> class my_template<int> {
    ...
};

// All pointer types are valid
template<typename T> class my_template<T*> {
    ...
};

// All other types are invalid, and will cause linker error messages.

[Minor EDIT 6/12/2013: 宣言されているが定義されていないテンプレートを使用すると、結果として リンカ というエラーメッセージが表示されるようになりました。]