0

この提案を使用して静的アサートを実行しようとしましたが、テンプレートのメソッド内で使用してもコンパイル エラーは発生しません。

例は次のとおりです。

#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 );
}

VLA は c++ ISO でサポートされていないという警告とともに、g++ 4.7.2 でコンパイルしました。

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

では、テンプレート メソッド内で STATIC_ASSERT を使用すると、コンパイルが失敗しないのはなぜでしょうか? 失敗させる方法はありますか?

:可能であれば、マクロのみで、c++98(おそらくc++03)ソリューションが必要です。

4

5 に答える 5

14

Prior to C++11 I would normally do:

typedef int static_assert_something[something ? 1 : -1];

You can also look at boost static assert. But it is too bloated for my liking. It is easy to make things bigger, it is hard to make them any better.

于 2013-01-31T09:09:07.137 に答える
3

Boost.StaticAssertのようなものを検討してください。ただし、それが利用できない場合は、テンプレートの定義を試すことができます。

template<bool>
struct static_assertion;

template<>
struct static_assertion<true> {};

ただし、メッセージが関連付けられていないという欠点があります。

StackOverflow を少し検索した後、この質問に出くわしました。この質問には、私の回答と同様の回答があり、ブーストなしでそれを行うための代替手段がたくさんありました。

于 2013-01-31T09:14:07.940 に答える
1
int foo(const int k)
{
  STATIC_ASSERT( k > 9, error_msg );
  return k+5;
}

静的アサーションは、コンパイル時の定数式でのみ機能します。

kコンパイル時の定数式ではありません。

非型テンプレート パラメーターは、テンプレートのインスタンス化中のコンパイル時の定数式であるため、次のようにコードを調整できます。

template <int K>
int foo()
{
  STATIC_ASSERT( K > 9, error_msg );
  return K+5;
}
于 2014-03-20T17:20:17.920 に答える
1

問題のメソッド (a.foo();) への呼び出しを追加すると、静的アサートは失敗します (その直後にメソッドがコンパイルされます)。「k」のような実行時の値に対して静的アサートを行うべきではないことはご存知でしょう。

于 2013-01-31T15:57:41.767 に答える