Specific C++ Macro

Specific C++ Macro

本文关键字:Macro C++ Specific      更新时间:2023-10-16

我想要一个C++宏,它可以变成这样的东西:

safe_cast<Type>(object)

Assert(dynamic_cast<Type>(object))

这可能吗?

我可以使用: safe_cast(Type, object) ,但这不是我所追求的。

这不能是一个宏,但肯定是一个函数模板就可以了:

template <class U, class T>
U safe_cast(T *const obj) {
    auto * const p = dynamic_cast<U>(obj);
    assert(p);
    return p;
}

像使用指针dynamic_cast一样调用。

不要使用宏。我们没有理由不能在这里使用模板函数,所以我们应该这样做!

template <typename T, typename U>
T safe_cast_helper( U& u, std::true_type )
{
    try {
        return dynamic_cast<T>(u);
    }
    catch (std::bad_cast& e)
    {
        assert( false && "Exception thrown!" ); // Or something better!
    }
}
template <typename T, typename U>
T safe_cast_helper( U& u, std::false_type )
{
    auto ptr = dynamic_cast<T>(u);
    assert( ptr );
    return ptr;
}
template <typename T, typename U>
T safe_cast( U& u )
{
    return safe_cast_helper<T>( u, std::is_reference<T>::type() );
}

你可以像平时一样使用它 dynamic_cast ,带有引用或指针。但是,我建议稍微改进错误报告!也许在断言之前写日志或其他东西是谨慎的。