Как использовать BOOST_STATIC_ASSERT - PullRequest
4 голосов
/ 26 декабря 2011
#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

Вопрос1 > Каков синтаксис следующего утверждения? И когда мы должны это использовать? Если это специализация шаблона, почему мы должны предоставить параметр, а не просто

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()

Question2 > Правда ли, что мы должны принять этот синтаксис в области действия функции, если мы должны использовать эту форму?

Question3 > Как исправить определение accepts_values_between_1_and_10_alternative, чтобы оно работало с BOOST_STATIC_ASSERT?

Спасибо

1 Ответ

5 голосов
/ 10 января 2012

Ваш template<typename T> void accepts_values_between_1_and_10_alternative(T i) не компилируется, поскольку параметры времени выполнения оцениваются после создания шаблонов.В области видимости оператор BOOST_STATIC_ASSERT(i >=1 && i < 10); означает, что i рассматривается как нетипизированный параметр шаблона.Однако во внешней области пространства имен i является параметром времени выполнения, для которого ищется только его тип , чтобы создать экземпляр int для T.Но значение 6 (даже если оно является константным выражением в вашей программе) оценивается только после создания экземпляра шаблона и не отображается в области действия функции во время вывода аргумента шаблона.

Для вашего template<int i> void accepts_values_between_1_and_10(), значение из i ищется для создания экземпляра 5 для i, и это значение распространяется обратно на BOOST_STATIC_ASSERT.

...