【发布时间】:2012-05-19 01:31:57
【问题描述】:
我刚刚注意到我的代码经常重复这种结构:
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 东西,只有一些(移动语义是最有趣的)。
【问题讨论】:
-
你应该使用 Boost.TypeTraits is_base_of()
-
我才意识到这已经被问到了:stackoverflow.com/questions/7020292/…
标签: c++ visual-studio-2010 templates boost