4

型が特定のクラスから派生したものかどうかに応じて分岐できるテンプレート関数を使用できるかどうか疑問に思っていました。おおまかに以下のように考えています。

class IEditable {};

class EditableThing : public IEditable {};

class NonEditableThing {};

template<typename T>
RegisterEditable( string name ) {
    // If T derives from IEditable, add to a list; otherwise do nothing - possible?
}


int main() {
    RegisterEditable<EditableThing>( "EditableThing" );  // should add to a list
    RegisterEditable<NonEditableThing>( "NonEditableThing" );  // should do nothing
}

誰かアイデアがあれば教えてください!:)

編集:追加する必要があります。指定されたオブジェクトをそのタイプを確認するためだけにインスタンス化/構築したくありません。

4

2 に答える 2

4

を使用した実装を次に示しますstd::is_base_of

#include <type_traits>

template <typename T>
void RegisterEditable( string name ) {
    if ( std::is_base_of<IEditable, T>::value ) {
        // add to the list
    }
}
于 2012-12-30T20:25:34.160 に答える
2

@Lightnessが指摘したように、type_traitsがその答えです。

C ++ 11にはそのboosttype_traitが含まれています:http://en.cppreference.com/w/cpp/types/is_base_of

于 2012-12-30T20:14:46.050 に答える