Wie zu tun static_assert mit Makros?

Habe ich versucht, dieser Vorschlag zu tun, eine statische behaupten, aber ich komme nicht auf einen Kompilierungsfehler, wenn ich es innerhalb einer Methode einer Vorlage.

Das Beispiel folgt :

#include <iostream>

#define STATIC_ASSERT(expr, msg)               \
{                                              \
    char STATIC_ASSERTION__##msg[(expr)?1:-1]; \
    (void)STATIC_ASSERTION__##msg[0];          \
}

template <typename T >
class A
{
public:
  int foo(const int k )
  {
    //does not work
    STATIC_ASSERT( k > 9, error_msg );
    return k+5;
  }
};

int bar(const int k )
{
  //works fine
  //STATIC_ASSERT( k > 9, error_msg );
  return k+5;
}

int main()
{
  A<int> a;
  const int v = 2;

  std::cout<<a.foo(v)<<std::endl;
  std::cout<<bar(v)<<std::endl;

  //works fine
  //STATIC_ASSERT( v > 9, error_msg );
}

Ich kompiliert es mit g++ 4.7.2, mit einer Warnung, dass VLAs nicht unterstützt c++ ISO :

g++ -Wall -g  -std=c++98 -Wextra -pedantic gvh.cpp

So, warum die Zusammenstellung nicht scheitern, wenn die STATIC_ASSERT wird innerhalb der template-Methode? Gibt es einen Weg, um es scheitern?

HINWEIS : ich brauche ein c++98 (vielleicht sogar noch c++03) - Lösung, wenn möglich, nur mit Makros.

  • Boost ist ein pre-C++11 static assert.
  • Ja, ich bin mir bewusst, BOOST_STATIC_ASSERT, aber es nutzt SFINAE zu überprüfen.
  • In den Antworten und vor da gibt es eine gute Beratung, auf die statische assert Mechanismen sind rund, aber im wesentlichen in Ihrer spezifischen Verwendung, die Sie versuchen zu behaupten, auf ein function-parameter - einfach, weil es const int bedeutet nicht, dass es compile-Zeit - Konstante, die nur bedeutet, dass die Funktion eine Kopie der runtime-argument und wird nicht zulassen, dass der genannte code, um es zu ändern. Sie müssen akzeptieren k als template-parameter (entweder für A oder durch A::foo eine template <int K> oder vielleicht Geige mit C++11 constexpr, um die compile-Zeit überprüfen Sie erwartet haben.
InformationsquelleAutor BЈовић | 2013-01-31
Schreibe einen Kommentar