【问题标题】:How to use BOOST_STATIC_ASSERT如何使用 BOOST_STATIC_ASSERT
【发布时间】:2011-12-25 21:53:30
【问题描述】:
#include <iostream>
#include <boost/static_assert.hpp>

using namespace std;

// I understand how the following template function works
// template <class T>
// T GetMax (T a, T b) {
//   T result;
//   result = (a>b)? a : b;
//   return (result);
// }    

// I have difficulties to understand how the following code works
// when we should use this syntax
template<int i> void accepts_values_between_1_and_10() {
  BOOST_STATIC_ASSERT(i >=1 && i < 10);
  cout << "i(between 1 and 10): " << i << endl;
}

// I created the following function to test the understanding of BOOST_STATIC_ASSERT
template<typename T> void accepts_values_between_1_and_10_alternative(T i) {
  BOOST_STATIC_ASSERT(i >=1 && i < 10);
  cout << "i(between 1 and 10): " << i << endl;
}

int main () {

  const int i = 5;
  accepts_values_between_1_and_10<i>();

  const int j = 6;
  accepts_values_between_1_and_10_alternative(j);

  return 0;
}

// $> g++ -o template_function -Wall -g template_function.cpp 
// template_function.cpp: In function ‘void accepts_values_between_1_and_10_alternative(T) [with T = int]’:
// template_function.cpp:33:48:   instantiated from here
// template_function.cpp:23:1: error: ‘((i > 0) && (i <= 9))’ is not a valid template argument for type ‘bool’ because it is a non-constant expression

Question1> 以下语句背后的语法是什么?我们什么时候应该使用它?如果是模板特化,为什么我们必须提供参数而不仅仅是提供参数

template<int> void accepts_values_between_1_and_10()
instead of
template<int i> void accepts_values_between_1_and_10()

template<int> void accepts_values_between_1_and_10(int i)
instead of
template<int i> void accepts_values_between_1_and_10()

问题2>如果我们必须使用这种形式,我们是否必须在函数范围内采用这种语法?

问题3> 如何更正accepts_values_between_1_and_10_alternative 的定义,使其与BOOST_STATIC_ASSERT 一起使用?

谢谢

【问题讨论】:

  • Static-assert 仅适用于编译时常量表达式,例如模板参数。它适用于普通函数参数。 C++11 和 C11 添加了 static_assert 语言结构,因此您不再需要 Boost。

标签: c++ templates boost name-lookup


【解决方案1】:

您的template&lt;typename T&gt; void accepts_values_between_1_and_10_alternative(T i) 未编译,因为运行时参数是在模板实例化后评估的。在函数范围内,语句BOOST_STATIC_ASSERT(i &gt;=1 &amp;&amp; i &lt; 10); 意味着i 正在被查找为非类型模板参数。但是,在封闭的命名空间范围内,i 是一个运行时参数,仅查找其类型 以将 int 实例化为 T。但是值 6(即使它是程序中的常量表达式)仅在模板实例化后计算,并且在模板参数推导期间在函数范围内不可见。

对于您的template&lt;int i&gt; void accepts_values_between_1_and_10(),正在查找i,以便为i 实例化5,并将此值传播回BOOST_STATIC_ASSERT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多