我刚注意到我的代码重复了这个结构:
if( someErrorHappened ){
string errorMsg = "Falcon Punch!";
::GetErrorLoggerInstance()->Log( LOG_TYPE_ERROR, "class", "method", errorMsg );
throw SomeCustomException( errorMsg );
}
我想我可以编写一个模板函数,以便我可以用这样的单行替换所有这些:
LogAndThrowIfError<SomeCustomException>( someErrorHappened, "class", "method", "Falcon Punch!" );
我可以用我的基本模板知识做到这一点。我的问题是,如果模板参数是一个不从特定类继承的类,我可以使用Boost来确保编译错误吗? (即我只想让这个函数用于我的自定义异常)。有点像C#的where
关键字用于泛型。
这可能看起来很牵强,但我需要强制执行此操作,因为我们的应用程序具有托管和非托管代码,并且我们的自定义本机异常映射到自定义托管异常,这就是为什么这只应该与我们的异常一起使用。
我在Visual Studio 2010中工作,所以我没有所有花哨的C ++ 11东西,只是其中的一部分(移动语义是最多的)。
答案 0 :(得分:3)
尝试
BOOST_STATIC_ASSERT(( boost::type_traits::is_base_of< ExceptionBaseClass, T >::value ));
它在内部做了@Zolyomi在他的回答中发布的相同检查。
答案 1 :(得分:2)
实际上,您不需要Boost或任何花哨的库来执行此操作,但如果您愿意,可以使用它们。最简单的方法是做一些像
这样的事情template<typename T>
void LogAndThrowIfError(...options...)
{
static ExceptionBaseClass *CheckBaseClass_WriteYourErrorMessageHere = static_cast<T*>(null);
... your logging code here ...
}
每次使用新类型T实例化模板时,它会检查一次T *是否可以转换为ExceptionBaseClass *,这基本上等同于T是从ExceptionBaseClass派生的。
请注意,如果检查失败,错误消息可能不是非常简单,如果您不介意依赖它们,Boost或其他库可能会提供更好的错误消息。