C ++编译时类型检查

时间:2012-12-30 20:09:38

标签: c++ templates

想知道是否可以使用可以分支的模板函数,具体取决于类型是否来自特定类。这大致是我的想法:

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
}

如果有任何想法让我知道! :)

编辑:我应该添加,我不想实例化/构造给定对象只是为了检查它的类型。

2 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:2)

正如@Lightness所说,type_traits就是答案。

C ++ 11包含了boost type_trait:http://en.cppreference.com/w/cpp/types/is_base_of