专门用于生成编译时错误的模板函数

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)

我找到了这篇文章,但它并没有真正提供我觉得适用于我的任何见解.有人可以帮忙吗?

Pra*_*ian 5

使用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)

现场演示

  • @DanForbes注意我的例子中额外的括号集?:)没有这些,`is_same`中的逗号被预处理器解释为参数分隔符.此外,您需要`BOOST_STATIC_ASSERT_MSG`是否要添加消息. (4认同)