Dan*_*bes 1 c++ templates boost static-assert
如果用户尝试使用给定的模板参数调用所述函数,那么如何在编译时专门化模板函数来生成错误?
通过使用以下习语,我能够为模板类获得此行为...
template <typename T>
class MyClass< std::vector<T> >;
Run Code Online (Sandbox Code Playgroud)
我试图修改的函数的基本签名是......
template <typename T>
T bar(const int arg) const {
...
}
Run Code Online (Sandbox Code Playgroud)
如果我使用与以前禁用某些模板类相同的范例......
template<>
std::string foo::bar(const int arg) const;
Run Code Online (Sandbox Code Playgroud)
我可以生成链接器错误,我认为这比运行时错误更令人满意,但仍然不是我正在寻找的.
因为我不能够使用C++ 11,我不能使用static_assert
,如所描述这里.相反,我试图这样使用BOOST_STATIC_ASSERT
......
template<>
std::string foo::bar(const int arg) const {
BOOST_STATIC_ASSERT(false);
return "";
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生以下编译时错误,即使我没有尝试使用我试图禁止的模板参数调用该函数的实例...
error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
Run Code Online (Sandbox Code Playgroud)
我找到了这篇文章,但它并没有真正提供我觉得适用于我的任何见解.有人可以帮忙吗?
使用boost::is_same
生成然后可以用使用编译时的布尔值BOOST_STATIC_ASSERT
进行检查.
template <typename T>
T bar(const int)
{
BOOST_STATIC_ASSERT_MSG((!boost::is_same<T, std::string>::value),
"T cannot be std::string");
return T();
}
bar<int>(10);
bar<std::string>(10); // fails static assertion
Run Code Online (Sandbox Code Playgroud)